diff --git a/apps/lang/norsk-nynorsk.lang b/apps/lang/norsk-nynorsk.lang index 928805ace2..0048e214ad 100644 --- a/apps/lang/norsk-nynorsk.lang +++ b/apps/lang/norsk-nynorsk.lang @@ -17,6 +17,7 @@ # Norwegian Nynorsk language file, translated by: # - Karl Ove Hufthammer # - Tore Johnny Bråtveit +# - Eivind Ødegård id: LANG_SET_BOOL_YES desc: bool true representation @@ -98,23 +99,7 @@ *: "Lastar …" - *: "" - - - - id: LANG_CONFIRM_SHUTDOWN - desc: in shutdown screen - user: core - - *: none - soft_shutdown: "Press OFF to shut down" - - - *: none - soft_shutdown: "Trykk AV for å slå av" - - - *: none + *: "Lastar" @@ -128,23 +113,7 @@ *: "Slår av …" - *: "" - - - - id: LANG_REMOVE_MMC - desc: before acknowledging usb in case an MMC is inserted (Ondio) - user: core - - *: none - archosondio*: "Please remove inserted MMC" - - - *: none - archosondio*: "Fjern minnekortet" - - - *: none + *: "Slår av" @@ -279,23 +248,6 @@ *: "Program" - - id: LANG_SHUTDOWN - desc: in main menu - user: core - - *: none - soft_shutdown: "Shut down" - - - *: none - soft_shutdown: "Slå av" - - - *: none - soft_shutdown: "Slå av" - - id: LANG_VOLUME desc: in sound_settings @@ -318,10 +270,10 @@ *: "Bass" - *: "Bass" + *: "~Bass" - *: "Bass" + *: "~Bass" @@ -354,30 +306,30 @@ id: LANG_CHANNEL_STEREO - desc: in sound_settings + desc: in sound_settings and radio screen user: core *: "Stereo" - *: "Stereo" + *: "~Stereo" - *: "Stereo" + *: "~Stereo" id: LANG_CHANNEL_MONO - desc: in sound_settings + desc: in sound_settings and radio screen user: core *: "Mono" - *: "Mono" + *: "~Mono" - *: "Mono" + *: "~Mono" @@ -430,10 +382,10 @@ *: "Karaoke" - *: "Karaoke" + *: "~Karaoke" - *: "Karaoke" + *: "~Karaoke" @@ -450,158 +402,6 @@ *: "Stereo-breidd" - - id: LANG_LOUDNESS - desc: in sound_settings - user: core - - *: none - masf: "Loudness" - - - *: none - masf: "Lydstyrke" - - - *: none - masf: "Lydstyrke" - - - - id: LANG_AUTOVOL - desc: in sound_settings - user: core - - *: none - masf: "Auto Volume" - - - *: none - masf: "Automatisk lydnivå" - - - *: none - masf: "Automatisk lydnivå" - - - - id: LANG_DECAY - desc: in sound_settings - user: core - - *: none - masf: "AV Decay Time" - - - *: none - masf: "Falltid for automatisk lydnivå" - - - *: none - - - - id: LANG_SUPERBASS - desc: in sound settings - user: core - - *: none - masf: "Super Bass" - - - *: none - masf: "Superbass" - - - *: none - masf: "Superbass" - - - - id: LANG_MDB_ENABLE - desc: in sound settings - user: core - - *: none - masf: "MDB Enable" - - - *: none - masf: "Bruk MDB" - - - *: none - masf: "Bruk MDB" - - - - id: LANG_MDB_STRENGTH - desc: in sound settings - user: core - - *: none - masf: "MDB Strength" - - - *: none - masf: "MDB-styrke" - - - *: none - masf: "MDB-styrke" - - - - id: LANG_MDB_HARMONICS - desc: in sound settings - user: core - - *: none - masf: "MDB Harmonics" - - - *: none - masf: "MDB-overtonar" - - - *: none - masf: "MDB-overtonar" - - - - id: LANG_MDB_CENTER - desc: in sound settings - user: core - - *: none - masf: "MDB Centre Frequency" - - - *: none - masf: "MDB-midtfrekvens" - - - *: none - masf: "MDB-midtfrekvens" - - - - id: LANG_MDB_SHAPE - desc: in sound settings - user: core - - *: none - masf: "MDB Shape" - - - *: none - masf: "MDB-form" - - - *: none - masf: "MDB-form" - - id: LANG_CROSSFEED desc: in sound settings @@ -680,10 +480,10 @@ *: "System" - *: "System" + *: "~System" - *: "System" + *: "~System" @@ -767,7 +567,7 @@ *: "Tømt" - *: "" + *: "Tømt" @@ -812,7 +612,7 @@ *: "Bruk tonekontroll" - *: none + *: "Bruk tonekontroll" @@ -826,7 +626,7 @@ *: "Grafisk tonekontroll" - *: none + *: "Grafisk tonekontroll" @@ -840,7 +640,7 @@ *: "Førehandskutting" - *: none + *: "Førehandskutting" @@ -851,10 +651,10 @@ *: "Simple EQ Settings" - *: "Enkelt oppsett" + *: "Enkelt EQ-oppsett" - *: none + *: "Enkelt EQ-oppsett" @@ -865,10 +665,10 @@ *: "Advanced EQ Settings" - *: "Avansert oppsett" + *: "Avansert EQ-oppsett" - *: none + *: "Avansert EQ-oppsett" @@ -882,7 +682,7 @@ *: "Lagra som ferdigoppsett" - *: none + *: "Lagra som ferdigoppsett" @@ -896,21 +696,7 @@ *: "Sjå gjennom ferdigoppsett" - *: none - - - - id: LANG_EQUALIZER_EDIT_MODE - desc: in the equalizer settings menu - user: core - - *: "Edit mode: %s" - - - *: "Redigeringsmodus: %s" - - - *: none + *: "Sjå gjennom ferdigoppsett" @@ -924,7 +710,7 @@ *: "%d Hz-bandforsterking" - *: none + *: "Hertz bandforsterking" @@ -935,10 +721,10 @@ *: "Low Shelf Filter" - *: "Lågskrankefilter" + *: "Bassfilter" - *: none + *: "Bassfilter" @@ -952,7 +738,7 @@ *: "Lydtoppfilter %d" - *: none + *: "Lydtoppfilter" @@ -963,10 +749,10 @@ *: "High Shelf Filter" - *: "Høgskrankefilter" + *: "Diskantfilter" - *: none + *: "Diskantfilter" @@ -994,7 +780,7 @@ *: "Midtfrekvens" - *: none + *: "Midtfrekvens" @@ -1263,10 +1049,10 @@ *: "Replaygain" - *: "Replaygain" + *: "Avspelingsvolum" - *: "Replaygain" + *: "Avspelingsvolum" @@ -1364,10 +1150,10 @@ *: "Database" - *: "Database" + *: "~Database" - *: "Database" + *: "~Database" @@ -1667,6 +1453,7 @@ *: none + remote: "Fjern-LCD-oppsett" @@ -1694,7 +1481,7 @@ *: "Status- og rullelinje" - *: none + *: "Status og rullelinje" @@ -1703,15 +1490,12 @@ user: core *: "Peak Meter" - masd: none *: "Lydtoppmålar" - masd: none *: "Lydtoppmålar" - masd: none @@ -1739,7 +1523,7 @@ *: "Latin-1 (ISO-8859-1)" - *: "Latin 1" + *: "Latin-1" @@ -1767,7 +1551,7 @@ *: "Hebraisk (ISO-8859-8)" - *: none + *: "Hebraisk" @@ -1792,10 +1576,10 @@ *: "Thai (ISO-8859-11)" - *: "Thai (ISO-8859-11)" + *: "~Thai (ISO-8859-11)" - *: none + *: "~Thai" @@ -1809,7 +1593,7 @@ *: "Arabisk (CP1256)" - *: none + *: "Arabisk" @@ -1851,7 +1635,7 @@ *: "Japansk (SJIS)" - *: none + *: "Japansk" @@ -1865,7 +1649,7 @@ *: "Kinesisk – forenkla (GB2312)" - *: none + *: "Forenkla kinesisk" @@ -1879,7 +1663,7 @@ *: "Koreansk (KSX1001)" - *: none + *: "Koreansk" @@ -1893,7 +1677,7 @@ *: "Kinesisk – tradisjonell (BIG5)" - *: none + *: "Tradisjonell kinesisk" @@ -1904,10 +1688,10 @@ *: "Unicode (UTF-8)" - *: "Unicode (UTF-8)" + *: "~Unicode (UTF-8)" - *: "Unicode" + *: "~Unicode" @@ -1932,10 +1716,10 @@ *: "Disk" - *: "Disk" + *: "~Disk" - *: "Disk" + *: "~Disk" @@ -1952,6 +1736,7 @@ *: none + rtc: "Dato og klokkeslett" @@ -2117,20 +1902,6 @@ *: "Vil du ha ei oversikt over nye bokmerke?" - - id: LANG_BOOKMARK_SETTINGS_UNIQUE_ONLY - desc: Save only on bookmark for each playlist in recent bookmarks - user: core - - *: "Unique only" - - - *: "Berre unike" - - - *: "Berre unike" - - id: LANG_VOICE_MENU desc: item of voice menu, enable/disable the voice UI @@ -2215,23 +1986,6 @@ *: ".talk-klipp" - - id: LANG_RECORDING_QUALITY - desc: in the recording settings - user: core - - *: none - recording_hwcodec: "Quality" - - - *: none - recording_hwcodec: "Kvalitet" - - - *: none - recording_hwcodec: "Kvalitet" - - id: LANG_FREQUENCY desc: in recording and playback settings @@ -2296,28 +2050,11 @@ *: none - recording: "Digital" + recording: "~Digital" *: none - recording: "Digital" - - - - id: LANG_RECORDING_EDITABLE - desc: Editable recordings setting - user: core - - *: none - recording_hwcodec: "Independent Frames" - - - *: none - recording_hwcodec: "Uavhengige rammer" - - - *: none - recording_hwcodec: "Uavhengige rammer" + recording: "~Digital" @@ -2351,23 +2088,7 @@ *: none - - - - id: LANG_RECORD_DIRECTORY - desc: in recording settings_menu - user: core - - *: none - recording: "Directory" - - - *: none - recording: "Mappe" - - - *: none - recording: "Mappe" + recording: "Forinnspelingstid" @@ -2418,6 +2139,7 @@ *: none + remote: "Berre hovudeining" @@ -2434,6 +2156,7 @@ *: none + remote: "Berre fjerneining" @@ -2450,6 +2173,7 @@ *: none + remote: "Hovud og fjerneining" @@ -2911,7 +2635,7 @@ *: "Felt (invers)" - *: none + *: "Felt invers" @@ -3153,23 +2877,6 @@ *: "Statuslinje" - - id: LANG_BUTTON_BAR - desc: in settings menu - user: core - - *: none - recorder_pad: "Button Bar" - - - *: none - recorder_pad: "Knapprad" - - - *: none - recorder_pad: "Knapprad" - - id: LANG_VOLUME_DISPLAY desc: Volume type title @@ -3232,15 +2939,12 @@ user: core *: "Peak Release" - masd: none *: "Lydtoppfråfall" - masd: none *: "Lydtoppfråfall" - masd: none @@ -3249,15 +2953,12 @@ user: core *: "Peak Hold Time" - masd: none *: "Lydtopphaldetid" - masd: none *: "Lydtopphaldetid" - masd: none @@ -3266,15 +2967,12 @@ user: core *: "Clip Hold Time" - masd: none *: "Klipphaldetid" - masd: none *: "Klipphaldetid" - masd: none @@ -3283,15 +2981,12 @@ user: core *: "Eternal" - masd: none *: "Uendeleg" - masd: none *: "Uendeleg" - masd: none @@ -3300,15 +2995,12 @@ user: core *: "Scale" - masd: none *: "Skala" - masd: none *: "Skala" - masd: none @@ -3317,11 +3009,9 @@ user: core *: "Logarithmic (dB)" - masd: none *: "Logarithmisk (dB)" - masd: none *: "Logarithmisk desibel" @@ -3333,11 +3023,9 @@ user: core *: "Linear (%)" - masd: none *: "Lineær (%)" - masd: none *: "Lineær prosent" @@ -3349,15 +3037,12 @@ user: core *: "Minimum of Range" - masd: none *: "Minste verdi" - masd: none *: "Minste verdi" - masd: none @@ -3366,15 +3051,12 @@ user: core *: "Maximum of Range" - masd: none *: "Største verdi" - masd: none *: "Største verdi" - masd: none @@ -3391,55 +3073,6 @@ *: "Batterikapasitet" - - id: LANG_BATTERY_TYPE - desc: in battery settings - user: core - - *: none - battery_types: "Battery Type" - - - *: none - battery_types: "Batteritype" - - - *: none - - - - id: LANG_BATTERY_TYPE_1 - desc: in battery settings - user: core - - *: none - battery_types: "Alkaline" - - - *: none - battery_types: "Alkaline" - - - *: none - battery_types: "Alkaline" - - - - id: LANG_BATTERY_TYPE_2 - desc: in battery settings - user: core - - *: none - battery_types: "NiMH" - - - *: none - battery_types: "NiMH" - - - *: none - - id: LANG_SPINDOWN desc: in settings_menu @@ -3681,7 +3314,7 @@ *: "Fila/mappa finst alt. Vil du skriva over ho?" - *: "" + *: "Fila eller mappa finst alt. Vil du skriva over ho?" @@ -3740,7 +3373,7 @@ *: "Er du sikker på at du vil sletta?" - *: "" + *: "Er du sikker på at du vil sletta?" @@ -3830,62 +3463,6 @@ *: "Stokk om" - - id: LANG_INSERT - desc: in onplay menu. insert a track/playlist into dynamic playlist. - user: core - - *: "Insert" - - - *: "Set inn" - - - *: "Set inn" - - - - id: LANG_INSERT_FIRST - desc: in onplay menu. insert a track/playlist into dynamic playlist. - user: core - - *: "Insert Next" - - - *: "Set inn som neste" - - - *: "Set inn som neste" - - - - id: LANG_INSERT_LAST - desc: in onplay menu. append a track/playlist into dynamic playlist. - user: core - - *: "Insert Last" - - - *: "Set inn til slutt" - - - *: "Set inn til slutt" - - - - id: LANG_INSERT_SHUFFLED - desc: in onplay menu. insert a track/playlist randomly into dynamic playlist - user: core - - *: "Insert Shuffled" - - - *: "Set inn tilfeldig" - - - *: "Set inn tilfeldig" - - id: LANG_QUEUE desc: The verb/action Queue @@ -3967,7 +3544,7 @@ *: "Søkjer … fann %d (%s)" - *: "" + *: "Søkjer fann" @@ -4026,39 +3603,7 @@ *: none - charging: "Batteri: Ladar" - - - - id: LANG_BATTERY_TOPOFF_CHARGE - desc: in info display, shows that top off charge is running Only for V1 archosrecorder - user: core - - *: none - archosrecorder: "Battery: Top-Off Chg" - - - *: none - archosrecorder: "Batteri: Top-off-lading" - - - *: none - - - - id: LANG_BATTERY_TRICKLE_CHARGE - desc: in info display, shows that trickle charge is running - user: core - - *: none - charging: "Battery: Trickle Chg" - - - *: none - charging: "Battery: Trickle-lading" - - - *: none + charging: "Batteri ladar" @@ -4068,11 +3613,10 @@ *: "Battery: %d%% %dh %dm" ipodmini1g,ipodmini2g,iriverh10: "Batt: %d%% %dh %dm" - iriverifp7xx: "%d%% %dh %dm" *: "Batteri: %d%% %dh %dm" - iriverifp7xx: "%d%% %dh %dm" + ipodmini1g,ipodmini2g,iriverh10: "~Batt: %d%% %dh %dm" *: "Batterinivå" @@ -4086,10 +3630,10 @@ *: "Disk:" - *: "Disk:" + *: "~Disk:" - *: "" + *: "Disk" @@ -4103,7 +3647,7 @@ *: "Ledig:" - *: "Ledig diskplass:" + *: "Ledig diskplass" @@ -4112,38 +3656,41 @@ user: core *: "Int:" + hibylinux: "mSD:" xduoox3: "mSD1:" - *: "Int:" - xduoox3: "mSD1:" + *: "Intern:" + hibylinux: "~mSD:" + xduoox3: "~mSD1:" *: "Intern" - xduoox3: "Micro S D 1" + hibylinux: "mikro S D" + xduoox3: "mikro S D 1" id: LANG_DISK_NAME_MMC - desc: in info menu; name for external disk with multivolume (Ondio; keep short!) + desc: in info menu; name for external disk with multivolume (keep short!) user: core *: none - archosondio*: "MMC:" - multivolume: "HD1" + hibylinux: "USB:" + multivolume: "HD1:" sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:" xduoox3: "mSD2:" *: none - archosondio*: "MMC" - multivolume: "HD1" - sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:" - xduoox3: "mSD2:" + hibylinux: "~USB:" + multivolume: "~HD1:" + sansac200*,sansaclipplus,sansae200*,sansafuze*: "~mSD:" + xduoox3: "~mSD2:" *: none - archosondio*: "M M C" + hibylinux: "U S B" multivolume: "H D 1" sansac200*,sansaclipplus,sansae200*,sansafuze*: "Micro S D" xduoox3: "Micro S D 2" @@ -4159,11 +3706,11 @@ *: none - rtc: "" + rtc: "Klokkeslett" *: none - rtc: "" + rtc: "Klokkeslett" @@ -4180,6 +3727,7 @@ *: none + pitchscreen: "" @@ -4196,6 +3744,7 @@ *: none + pitchscreen: "" @@ -4206,10 +3755,10 @@ *: "Pause" - *: "Pause" + *: "~Pause" - *: "Pause" + *: "~Pause" @@ -4275,8 +3824,8 @@ *: none rtc: "OFF = Revert" + aigoerosq,erosqnative,gigabeats,sansafuzeplus,xduoox3*: "BACK = Revert" gigabeatfx,mrobe500: "POWER = Revert" - gigabeats,sansafuzeplus: "BACK = Revert" gogearsa9200: "LEFT = Revert" iaudiom5,iaudiox5: "RECORD = Revert" ipod*,mpiohd300,sansac200*: "MENU = Revert" @@ -4289,8 +3838,9 @@ *: none rtc: "OFF = tilbakestill" - gigabeatfx,mrobe500: "POWER = Tilbakestill" + aigoerosq,erosqnative,xduoox3*: "BACK = Tilbakestill" gigabeats,sansafuzeplus: "BACK = Tilbakestill" + gigabeatfx,mrobe500: "POWER = Tilbakestill" gogearsa9200: "LEFT = Tilbakestill" iaudiom5,iaudiox5: "RECORD = Tilbakestill" ipod*,mpiohd300,sansac200*: "MENU = Tilbakestill" @@ -4318,6 +3868,7 @@ *: none + recording: "" @@ -4334,6 +3885,7 @@ *: none + recording: "" @@ -4358,6 +3910,7 @@ *: none + iaudiom5,iaudiox5,iriverh100,iriverh120,iriverh300,recording,samsungyh*,sansac200*,sansae200*,vibe500: "" @@ -4428,22 +3981,6 @@ recording: "Førdelingsrom" - - id: LANG_DB_INF - desc: -inf db for values below measurement - user: core - - *: none - recording: "-inf" - - - *: none - recording: "–uendeleg" - - - *: none - - id: LANG_ALARM_MOD_TIME desc: The current alarm time shown in the alarm menu for the RTC alarm mod. @@ -4458,6 +3995,7 @@ *: none + alarm: "" @@ -4474,22 +4012,7 @@ *: none - - - - id: LANG_ALARM_MOD_SHUTDOWN - desc: The text that tells the user that the alarm time is ok and the device shuts off (for the RTC alarm mod). - user: core - - *: none - alarm: "Alarm Set" - - - *: none - alarm: "Alarm stilt inn" - - - *: none + alarm: "Vaknar opp om" @@ -4509,33 +4032,6 @@ alarm: "Vekking om for kort tid" - - id: LANG_ALARM_MOD_KEYS - desc: Shown key functions in alarm menu (for the RTC alarm mod). - user: core - - *: none - alarm: "PLAY=Set OFF=Cancel" - gigabeats: "SELECT=Set POWER=Cancel" - ipod*: "SELECT=Set MENU=Cancel" - iriverh10,iriverh10_5gb: "SELECT=Set PREV=Cancel" - mpiohd300: "ENTER=Set MENU=Cancel" - sansafuzeplus: "SELECT=Set BACK=Cancel" - vibe500: "OK=Set C=Cancel" - - - *: none - alarm: "SPEL = vel – AV = avbryt" - gigabeats: "VEL = vel – PÅ/AV = avbryt" - ipod*: "VEL = vel – MENY = avbryt" - iriverh10,iriverh10_5gb: "VEL = vel – TILBAKE = avbryt" - mpiohd300: "ENTER = vel – MENU = avbryt" - vibe500: "OK = vel – C = avbryt" - - - *: none - - id: LANG_ALARM_MOD_DISABLE desc: Announce that the RTC alarm has been turned off @@ -4567,6 +4063,7 @@ *: none + lcd_color: "" @@ -4583,6 +4080,7 @@ *: none + lcd_color: "" @@ -4599,6 +4097,7 @@ *: none + lcd_color: "" @@ -4623,10 +4122,10 @@ *: "Artist" - *: "Artist" + *: "~Artist" - *: "Artist" + *: "~Artist" @@ -4637,10 +4136,10 @@ *: "Album" - *: "Album" + *: "~Album" - *: "Album" + *: "~Album" @@ -4721,10 +4220,10 @@ *: "Bitrate" - *: "Bitrate" + *: "~Bitrate" - *: "Bitrate" + *: "~Bitrate" @@ -4769,20 +4268,6 @@ *: "Sporforsterking" - - id: LANG_ID3_ALBUM_GAIN - desc: in tag viewer - user: core - - *: "Album Gain" - - - *: "Albumforsterking" - - - *: "Albumforsterking" - - id: LANG_ID3_PATH desc: in tag viewer @@ -4825,6 +4310,7 @@ *: none + rtc: "" @@ -4841,6 +4327,7 @@ *: none + rtc: "" @@ -4857,6 +4344,7 @@ *: none + rtc: "" @@ -4873,6 +4361,7 @@ *: none + rtc: "" @@ -4889,6 +4378,7 @@ *: none + rtc: "" @@ -4905,6 +4395,7 @@ *: none + rtc: "" @@ -4921,6 +4412,7 @@ *: none + rtc: "" @@ -4931,10 +4423,10 @@ *: "Jan" - *: "Jan" + *: "~Jan" - *: none + *: "Januar" @@ -4945,10 +4437,10 @@ *: "Feb" - *: "Feb" + *: "~Feb" - *: none + *: "Februar" @@ -4959,10 +4451,10 @@ *: "Mar" - *: "Mar" + *: "~Mar" - *: none + *: "Mars" @@ -4973,10 +4465,10 @@ *: "Apr" - *: "Apr" + *: "~Apr" - *: none + *: "April" @@ -5001,10 +4493,10 @@ *: "Jun" - *: "Jun" + *: "~Jun" - *: none + *: "Juni" @@ -5015,10 +4507,10 @@ *: "Jul" - *: "Jul" + *: "~Jul" - *: none + *: "Juli" @@ -5029,10 +4521,10 @@ *: "Aug" - *: "Aug" + *: "~Aug" - *: none + *: "August" @@ -5043,10 +4535,10 @@ *: "Sep" - *: "Sep" + *: "~Sep" - *: none + *: "September" @@ -5057,10 +4549,10 @@ *: "Oct" - *: "Okt" + *: "~Okt" - *: none + *: "Oktober" @@ -5071,10 +4563,10 @@ *: "Nov" - *: "Nov" + *: "~Nov" - *: none + *: "November" @@ -5085,10 +4577,10 @@ *: "Dec" - *: "Des" + *: "~Des" - *: none + *: "Desember" @@ -5777,48 +5269,6 @@ *: "" - - id: LANG_KILOBYTE - desc: a unit postfix, also voiced - user: core - - *: "KB" - - - *: "KB" - - - *: "kilobyte" - - - - id: LANG_MEGABYTE - desc: a unit postfix, also voiced - user: core - - *: "MB" - - - *: "MB" - - - *: "megabyte" - - - - id: LANG_GIGABYTE - desc: a unit postfix, also voiced - user: core - - *: "GB" - - - *: "GB" - - - *: "gigabyte" - - id: LANG_POINT desc: decimal separator for composing numbers @@ -6365,6 +5815,7 @@ *: none + remote: "speleskjerm på fjern eining" @@ -6417,10 +5868,10 @@ *: "Inserted %d tracks (%s)" - *: "Sett inn %d spor (%s)" + *: "Set inn %d spor (%s)" - *: "" + *: "Set inn spor" @@ -6434,7 +5885,7 @@ *: "Lagt %d spor i kø (%s)" - *: "" + *: "Lagt spor i kø" @@ -6448,7 +5899,7 @@ *: "Lagra %d spor (%s)" - *: "" + *: "Lagra spor" @@ -6493,20 +5944,6 @@ *: "Ingenting å halda fram med" - - id: LANG_PLAYLIST_CONTROL_UPDATE_ERROR - desc: Playlist error - user: core - - *: "Error updating playlist control file" - - - *: "Feil ved oppdatering av spelelistekontrollfil" - - - *: "Feil ved oppdatering av spelelistekontrollfil" - - id: LANG_PLAYLIST_ACCESS_ERROR desc: Playlist error @@ -6665,86 +6102,6 @@ radio: "Ferdigoppsettlista er full" - - id: LANG_BUTTONBAR_MENU - desc: in button bar - user: core - - *: none - radio_screen_button_bar: "Menu" - - - *: none - radio_screen_button_bar: "Meny" - - - *: none - - - - id: LANG_FM_BUTTONBAR_EXIT - desc: in radio screen - user: core - - *: none - radio_screen_button_bar: "Exit" - - - *: none - radio_screen_button_bar: "Avslutt" - - - *: none - - - - id: LANG_FM_BUTTONBAR_ACTION - desc: in radio screen - user: core - - *: none - radio_screen_button_bar: "Action" - - - *: none - radio_screen_button_bar: "Handling" - - - *: none - - - - id: LANG_FM_BUTTONBAR_ADD - desc: in radio screen - user: core - - *: none - radio_screen_button_bar: "Add" - - - *: none - radio_screen_button_bar: "Legg til" - - - *: none - - - - id: LANG_FM_BUTTONBAR_RECORD - desc: in radio screen - user: core - - *: none - radio_screen_button_bar: "Record" - - - *: none - radio_screen_button_bar: "Ta opp" - - - *: none - - id: LANG_FM_MONO_MODE desc: in radio screen @@ -6776,6 +6133,7 @@ *: none + radio: "" @@ -6788,10 +6146,11 @@ *: none - radio: "Søk automatisk" + radio: "Søk automatisk i ferdigoppsett" *: none + radio: "Søk automatisk i ferdigoppsett" @@ -6825,6 +6184,7 @@ *: none + radio: "Søkjer" @@ -6841,6 +6201,7 @@ *: none + radio: "" @@ -6871,7 +6232,7 @@ *: "Mappebufferen er full" - *: "" + *: "Mappebufferen er full" @@ -6946,7 +6307,7 @@ id: LANG_OFF_ABORT - desc: Used on archosrecorder models + desc: Used on many models user: core *: "OFF to abort" @@ -6958,13 +6319,13 @@ iriverh100,iriverh120,iriverh300: "STOP to abort" - *: "OFF for å avbryte" - gigabeatfx: "POWER for å avbryte" - gigabeats,sansafuzeplus: "BACK for å avbryte" - iaudiom5,iaudiox5: "PLAY (langt trykk) for å avbryte" - ipod*: "PLAY/PAUSE for å avbryte" - iriverh10,iriverh10_5gb,sansac200*,sansae200*,vibe500: "PREV for å avbryte" - iriverh100,iriverh120,iriverh300: "STOP for å avbryte" + *: "OFF for å avbryta" + gigabeatfx: "POWER for å avbryta" + gigabeats,sansafuzeplus: "BACK for å avbryta" + iaudiom5,iaudiox5: "PLAY (langt trykk) for å avbryta" + ipod*: "PLAY/PAUSE for å avbryta" + iriverh10,iriverh10_5gb,sansac200*,sansae200*,vibe500: "PREV for å avbryta" + iriverh100,iriverh120,iriverh300: "STOP for å avbryta" *: "" @@ -7093,7 +6454,7 @@ *: "Klarte ikkje opna «%s»" - *: "" + *: "Klarte ikkje opna" @@ -7107,12 +6468,12 @@ *: "Klarte ikkje lesa «%s»" - *: "" + *: "Klarte ikkje lesa" id: LANG_PLUGIN_WRONG_MODEL - desc: The plugin is not compatible with the archos model trying to run it + desc: The plugin is not compatible with the player model trying to run it user: core *: "Incompatible model" @@ -7121,7 +6482,7 @@ *: "Inkompatibel modell" - *: "" + *: "Inkompatibel modell" @@ -7135,7 +6496,7 @@ *: "Inkompatibel versjon" - *: "" + *: "Inkompatibel versjon" @@ -7149,7 +6510,7 @@ *: "Programmet gav ei feilmelding" - *: "" + *: "Programmet gav ei feilmelding" @@ -7262,7 +6623,7 @@ *: "Direkteforsterking" - *: none + *: "Direkteforsterking" @@ -7276,7 +6637,7 @@ *: "Kryssforsterking" - *: none + *: "Kryssforsterking" @@ -7290,7 +6651,7 @@ *: "Høgfrekvensdemping" - *: none + *: "Høgfrekvensdemping" @@ -7304,7 +6665,7 @@ *: "Høgfrekvensgrense" - *: none + *: "Høgfrekvensgrense" @@ -7456,20 +6817,6 @@ recording: "Oppdelingsstorleik" - - id: LANG_CATALOG - desc: in onplay menu - user: core - - *: "Playlist Catalogue" - - - *: "Spelelistekatalog" - - - *: "Spelelistekatalog" - - id: LANG_SPLIT_MEASURE desc: in record timesplit options @@ -7518,20 +6865,6 @@ recording: "Oppdelingstid" - - id: LANG_CATALOG_ADD_TO - desc: in onplay playlist catalogue submenu - user: core - - *: "Add to Playlist" - - - *: "Legg til speleliste" - - - *: "Legg til speleliste" - - id: LANG_START_NEW_FILE desc: in record timesplit options @@ -7566,20 +6899,6 @@ recording: "Gjer dette ved oppdeling" - - id: LANG_CATALOG_VIEW - desc: in onplay playlist catalogue submenu - user: core - - *: "View Catalogue" - - - *: "Vis katalog" - - - *: "Vis katalog" - - id: LANG_CATALOG_NO_DIRECTORY desc: error message when playlist catalogue directory doesn't exist @@ -7591,7 +6910,7 @@ *: "«%s» finst ikkje" - *: "" + *: "finst ikkje" @@ -7608,40 +6927,6 @@ *: "Ingen spelelister" - - id: LANG_SYSFONT_CHANNEL_STEREO - desc: in sound_settings - user: core - - *: none - recording: "Stereo" - - - *: none - recording: "Stereo" - - - *: none - recording: "Stereo" - - - - id: LANG_SYSFONT_CHANNEL_MONO - desc: in sound_settings - user: core - - *: none - recording: "Mono" - - - *: none - recording: "Mono" - - - *: none - recording: "Mono" - - id: LANG_SYSFONT_EQUALIZER_EDIT_MODE desc: in the equalizer settings menu @@ -7650,7 +6935,7 @@ *: "Edit mode: %s %s" - *: "Redigeringsmodus: %s" + *: "Redigeringsmodus: %s %s" *: "" @@ -7670,170 +6955,18 @@ *: "Frekvensgrense" - - id: LANG_SYSFONT_RECORDING_QUALITY - desc: in the recording settings - user: core - - *: none - recording_hwcodec: "Quality" - - - *: none - recording_hwcodec: "Kvalitet" - - - *: none - recording_hwcodec: "Kvalitet" - - - - id: LANG_SYSFONT_RECORDING_FREQUENCY - desc: in the recording settings - user: core - - *: none - recording: "Frequency" - - - *: none - recording: "Frekvens" - - - *: none - recording: "Frekvens" - - - - id: LANG_SYSFONT_RECORDING_SOURCE - desc: in the recording settings - user: core - - *: none - recording: "Source" - - - *: none - recording: "Kjelde" - - - *: none - recording: "Kjelde" - - - - id: LANG_SYSFONT_RECORDING_SRC_MIC - desc: in the recording settings - user: core - - *: none - recording: "Int. Mic" - - - *: none - recording: "Intern mikrofon" - - - *: none - - - - id: LANG_SYSFONT_RECORDING_SRC_DIGITAL - desc: in the recording settings - user: core - - *: none - recording: "Digital" - - - *: none - recording: "Digital" - - - *: none - recording: "Digital" - - - - id: LANG_SYSFONT_RECORD_TRIGGER - desc: in recording settings_menu - user: core - - *: none - recording: "Trigger" - - - *: none - recording: "Utløysar" - - - *: none - recording: "Utløysar" - - - - id: LANG_SYSFONT_DIRBROWSE_F1 - desc: in dir browser, F1 button bar text - user: core - - *: none - recorder_pad: "Menu" - - - *: none - recorder_pad: "Meny" - - - *: none - - - - id: LANG_SYSFONT_DIRBROWSE_F2 - desc: in dir browser, F2 button bar text - user: core - - *: none - recorder_pad: "Option" - - - *: none - recorder_pad: "Val" - - - *: none - - - - id: LANG_SYSFONT_DIRBROWSE_F3 - desc: in dir browser, F3 button bar text - user: core - - *: none - recorder_pad: "LCD" - - - *: none - recorder_pad: "LCD" - - - *: none - - id: LANG_NEVER desc: in lcd settings user: core - *: none - lcd_sleep: "Never" + *: "Never" - *: none - lcd_sleep: "Aldri" + *: "Aldri" - *: none - lcd_sleep: "Aldri" + *: "Aldri" @@ -7846,10 +6979,11 @@ *: none - agc: "DJ-Set (slow)" + agc: "DJ-sett (sein)" *: none + agc: "D J sett sein" @@ -7862,10 +6996,11 @@ *: none - lcd_sleep: "Sov (etter at lyset er av)" + lcd_sleep: "Dvale (etter at lyset er av)" *: none + lcd_sleep: "Dvale etter at lyset er av" @@ -7929,11 +7064,11 @@ *: none - remote: "(Vol- : Re-enable)" + remote: "(Vol- : Skru på att)" *: none - remote: "(Vol- : Re-enable)" + remote: "Volum skru på att" @@ -7978,10 +7113,10 @@ *: "Loading... %d%% done (%s)" - *: "Lastar … %d% % fullført (%s)" + *: "Loading... %d%% done (%s)" - *: "" + *: "Lastar vent ferdig" @@ -8017,15 +7152,16 @@ desc: in lcd settings user: core - *: none + *: "Backlight on Lock" hold_button: "Backlight on Hold" - *: none + *: "Skjermlys med låseknappen" hold_button: "Lys (med «Hold»-knappen)" - *: none + *: "Skjermlys med låseknappen" + hold_button: "Skjermlys med hold-knappen" @@ -8069,11 +7205,11 @@ *: none - radio: "Korea" + radio: "~Korea" *: none - radio: "Korea" + radio: "~Korea" @@ -8090,6 +7226,7 @@ *: none + radio: "U S A og Kanada" @@ -8119,11 +7256,11 @@ *: none - radio: "Japan" + radio: "~Japan" *: none - radio: "Japan" + radio: "~Japan" @@ -8184,10 +7321,11 @@ *: none - usb_charging_enable: "Lad batteri ved USB-samband" + usb_charging_enable: "Lad batteriet ved USB-samband" *: none + usb_charging_enable: "Lad batteriet ved U S B samband" @@ -8204,6 +7342,7 @@ *: none + recording: "same som kjelda" @@ -8245,10 +7384,10 @@ *: "Format" - *: "Format" + *: "~Format" - *: "Format" + *: "~Format" @@ -8278,11 +7417,11 @@ *: none - recording: "Bitrate" + recording: "~Bitrate" *: none - recording: "Bitrate" + recording: "~Bitrate" @@ -8375,20 +7514,7 @@ *: none - - - - id: LANG_REPLACE - desc: in onplay menu. Replace the current playlist with a new one. - user: core - - *: "Play Next" - - - *: "Spel neste" - - - *: "Spel neste" + recording: "Ingen innstillingar" @@ -8466,16 +7592,16 @@ id: LANG_DITHERING - desc: in the sound settings menu + desc: in the sound settings and some other menus user: core *: "Dithering" - *: "Dithering" + *: "Utjamning" - *: "Dithering" + *: "Utjamning" @@ -8539,16 +7665,16 @@ id: LANG_AUDIOSCROBBLER - desc: "Last.fm Log" in the playback menu + desc: "Last.fm Logger" in Plugin/apps/scrobbler user: core - *: "Last.fm Log" + *: "Last.fm Logger" *: "Last.fm-logg" - *: "Last.fm-logg" + *: "Last F M logg" @@ -8565,6 +7691,7 @@ *: none + recording: "Starttype" @@ -8784,23 +7911,6 @@ *: "einingar per tikk" - - id: LANG_SYSFONT_LINE_IN - desc: in the recording settings - user: core - - *: none - recording: "Line In" - - - *: none - recording: "Linje inn" - - - *: none - recording: "Linje inn" - - id: LANG_SCANNING_DISK desc: when booting up and rebuilding the cache and calculating free space @@ -8973,14 +8083,12 @@ user: core *: "Buffer:" - archosplayer: "Buf:" - *: "Buffer:" - archosplayer: "Buf:" + *: "~Buffer:" - *: "" + *: "Buffer" @@ -9037,17 +8145,16 @@ user: core *: "PLAY = Yes" - archosplayer: "(PLAY/STOP)" cowond2*: "MENU, or top-right = Yes" - gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = Yes" + creativezen*,gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = Yes" iriverh100,iriverh120,iriverh300: "NAVI = Yes" mrobe500: "PLAY, POWER, or top-right = Yes" vibe500: "OK = Yes" *: "PLAY = ja" - archosplayer: "(PLAY/STOP)" cowond2*: "MENU eller topp høgre = ja" + creativezen*: "SELECT = ja" gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = ja" iriverh100,iriverh120,iriverh300: "NAVI = ja" mrobe500: "PLAY, POWER eller topp høgre = ja" @@ -9064,8 +8171,8 @@ *: none rtc: "ON = Set" + aigoerosq,erosqnative,gogearsa9200,samsungyh*,xduoox3*: "PLAY = Set" gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = Set" - gogearsa9200,samsungyh*: "PLAY = Set" iriverh100,iriverh120,iriverh300: "NAVI = Set" mpiohd300: "ENTER = Set" mrobe500: "HEART = Set" @@ -9073,13 +8180,14 @@ *: none - rtc: "PÅ = velg" - gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = velg" - gogearsa9200,samsungyh*: "PLAY = velg" - iriverh100,iriverh120,iriverh300: "NAVI = velg" - mpiohd300: "ENTER = velg" - mrobe500: "HEART = velg" - vibe500: "OK = velg" + rtc: "PÅ = vel" + aigoerosq,erosqnative,xduoox3*: "PLAY = vel" + gogearsa9200,samsungyh*: "PLAY = vel" + gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = vel" + iriverh100,iriverh120,iriverh300: "NAVI = vel" + mpiohd300: "ENTER = vel" + mrobe500: "HEART = vel" + vibe500: "OK = vel" *: none @@ -9091,15 +8199,12 @@ user: core *: "Any Other = No" - archosplayer: none *: "Andre = nei" - archosplayer: none *: "" - archosplayer: none @@ -9223,29 +8328,12 @@ user: core *: "End of Song List" - archosplayer: "End of List" *: "Slutt på songliste" - archosplayer: "Slutt på liste" *: "Slutt på songliste" - archosplayer: "Slutt på liste" - - - - id: LANG_SYSFONT_GAIN - desc: in the equalizer settings menu - user: core - - *: "Gain" - - - *: "Forsterking" - - - *: "Forsterking" @@ -9293,20 +8381,6 @@ *: "P M" - - id: LANG_SYSFONT_MODE - desc: in wps F2 pressed - user: core - - *: "Mode:" - - - *: "Modus:" - - - *: "" - - id: LANG_MIN_DURATION desc: in recording settings_menu @@ -9363,7 +8437,7 @@ *: "Modus:" - *: "Modus:" + *: "Modus" @@ -9414,23 +8488,6 @@ *: "Arbeid" - - id: LANG_HEADPHONE_UNPLUG_RW - desc: in pause_phones_menu. - user: core - - *: none - headphone_detection: "Duration to Rewind" - - - *: none - headphone_detection: "Kor lenge å spola tilbake" - - - *: none - headphone_detection: "Kor lenge å spola tilbake" - - id: LANG_PITCH_UP_SEMITONE desc: in wps @@ -9521,20 +8578,6 @@ *: "Ikkje hald fram" - - id: LANG_BOOKMARK_CONTEXT_DELETE - desc: bookmark context menu, delete this bookmark - user: core - - *: "Delete" - - - *: "Slett" - - - *: "Slett" - - id: VOICE_OCLOCK desc: spoken only, for wall clock announce @@ -9546,7 +8589,7 @@ *: "" - *: "" + *: "o'clock" @@ -9633,7 +8676,7 @@ *: "" - *: "cuesheet" + *: "cue ark" @@ -9664,26 +8707,9 @@ *: "Ugyldig bokmerke" - - id: LANG_SYSFONT_CHANNELS - desc: in the recording settings - user: core - - *: none - recording: "Channels" - - - *: none - recording: "Kanalar" - - - *: none - recording: "Kanalar" - - id: LANG_PLAYLISTS - desc: in the main menu and file view setting + desc: in the main menu and Playlist settings menu user: core *: "Playlists" @@ -9807,23 +8833,6 @@ *: "Kopierer" - - id: LANG_SET_AS_REC_DIR - desc: used in the onplay menu to set a recording dir - user: core - - *: none - recording: "Set as Recording Directory" - - - *: none - recording: "Bruk som opptaksmappe" - - - *: none - recording: "Bruk som opptaksmappe" - - id: LANG_REMOTE_WHILE_PLAYING desc: in settings_menu() @@ -9834,10 +8843,11 @@ *: none - remote: "Browse .rwps files" + remote: "Speleskjerm på fjern eining" *: none + remote: "Speleskjerm på fjern eining" @@ -10428,7 +9438,7 @@ *: none - agc: "AGC" + agc: "Automatisk lydforsterking" *: none @@ -10539,3 +9549,7432 @@ *: "Filstorleik" + + id: LANG_CHANNEL_LEFTRIGHT + desc: in sound_settings + user: core + + *: none + recording: "Mono Left + Right" + + + *: none + recording: "Mono venstre + høgre" + + + *: none + recording: "Mono venstre pluss høgre" + + + + id: LANG_RESET_EQUALIZER + desc: in the equalizer settings menu + user: core + + *: "Reset EQ" + + + *: "Nullstill EQ" + + + *: "Nullstill E Q" + + + + id: LANG_SINGLE_MODE + desc: single mode + user: core + + *: "Single Mode" + + + *: "Singelmodus" + + + *: "Singelmodus" + + + + id: LANG_DISPLAY_TITLEALBUM_FROMTAGS + desc: track display options + user: core + + *: "Title & Album from ID3 tags" + + + *: "Tittel og album frå ID3-merkelappar" + + + *: "Tittel og album frå I D 3" + + + + id: LANG_DISPLAY_TITLE_FROMTAGS + desc: track display options + user: core + + *: "Title from ID3 tags" + + + *: "Tittel frå ID3-merkelappar" + + + *: "Tittel frå I D 3" + + + + id: LANG_RANDOM_SHUFFLE_RANDOM_SELECTIVE_SONGS_SUMMARY + desc: a summary splash screen that appear on the database browser when you try to create a playlist from the database browser that exceeds your system limit + user: core + + *: "Selection too big, %d random tracks will be selected" + + + *: "For stort utval, det blir valt %d tilfeldige spor" + + + *: "For stort utval, færre tilfeldige spor blir valde" + + + + id: LANG_DISPLAY_SPECIAL_CHARACTER + desc: Special character (japanese, accents, etc) + user: core + + *: "Special character" + + + *: "Spesialteikn" + + + *: "Spesialteikn" + + + + id: LANG_ID3_ALBUMARTISTS + desc: in tag viewer + user: core + + *: "Album Artists" + + + *: "Albumartistar" + + + *: "Albumartistar" + + + + id: LANG_ADD_CURRENT_TO_FAVES + desc: + user: core + + *: "Add Current to Shortcuts" + + + *: "Legg til denne i snarvegar" + + + *: "Legg til denne i snarvegar" + + + + id: LANG_TALK_MIXER_LEVEL + desc: Relative volume of voice prompts + user: core + + *: "Voice Prompt Volume" + + + *: "Stemmevolum" + + + *: "Stemmevolum" + + + + id: LANG_DEADZONE + desc: touchpad deadzone setting + user: core + + *: none + sansafuzeplus: "Touchpad Dead Zone" + + + *: none + sansafuzeplus: "Daudsone for styrefelt" + + + *: none + sansafuzeplus: "Daudsone for styrefelt" + + + + id: LANG_SERIAL_BITRATE + desc: in system settings menu + user: core + + *: none + serial_port: "Serial Bitrate" + + + *: none + serial_port: "Seriell bitrate" + + + *: none + serial_port: "Seriell bitrate" + + + + id: LANG_SERIAL_BITRATE_AUTO + desc: in system settings menu + user: core + + *: none + serial_port: "Auto" + + + *: none + serial_port: "~Auto" + + + *: none + serial_port: "~Auto" + + + + id: LANG_SERIAL_BITRATE_9600 + desc: in system settings menu + user: core + + *: none + serial_port: "9600" + + + *: none + serial_port: "~9600" + + + *: none + serial_port: "~9600" + + + + id: LANG_SERIAL_BITRATE_19200 + desc: in system settings menu + user: core + + *: none + serial_port: "19200" + + + *: none + serial_port: "~19200" + + + *: none + serial_port: "~19200" + + + + id: LANG_SERIAL_BITRATE_38400 + desc: in system settings menu + user: core + + *: none + serial_port: "38400" + + + *: none + serial_port: "~38400" + + + *: none + serial_port: "~38400" + + + + id: LANG_SERIAL_BITRATE_57600 + desc: in system settings menu + user: core + + *: none + serial_port: "57600" + + + *: none + serial_port: "~57600" + + + *: none + serial_port: "~57600" + + + + id: LANG_RECORDING_MONO_MODE + desc: in the recording settings + user: core + + *: none + recording: "Mono mode" + + + *: none + recording: "Monomodus" + + + *: none + recording: "Monomodus" + + + + id: LANG_SEARCH_RESULTS + desc: title for the list of results displayed after searching in a playlist + user: core + + *: "Search Results" + + + *: "Søkjeresultat" + + + *: "Søkjeresultat" + + + + id: LANG_LEFT + desc: Generic use of 'left' + user: core + + *: "Left" + + + *: "Venstre" + + + *: "Venstre" + + + + id: LANG_RIGHT + desc: Generic use of 'right' + user: core + + *: "Right" + + + *: "Høgre" + + + *: "Høgre" + + + + id: LANG_RESET_SETTING + desc: used in the settings context menu + user: core + + *: "Reset Setting" + + + *: "Nullstill" + + + *: "Nullstill" + + + + id: LANG_LEFT_QS_ITEM + desc: used for the submenu name for the quickscreen items + user: core + + *: none + quickscreen: "Set as Left Quickscreen Item" + + + *: none + quickscreen: "Bruk som venstre snøggskjermelement" + + + *: none + quickscreen: "Bruk som venstre snøggskjermelement" + + + + id: LANG_RIGHT_QS_ITEM + desc: used for the submenu name for the quickscreen items + user: core + + *: none + quickscreen: "Set as Right Quickscreen Item" + + + *: none + quickscreen: "Bruk som høgre snøggskjermelement" + + + *: none + quickscreen: "Bruk som høgre snøggskjermelement" + + + + id: LANG_BOTTOM_QS_ITEM + desc: used for the submenu name for the quickscreen items + user: core + + *: none + quickscreen: "Set as Bottom Quickscreen Item" + + + *: none + quickscreen: "Bruk som nedre snøggskjermelement" + + + *: none + quickscreen: "Bruk som nedre snøggskjermelement" + + + + id: LANG_CREDITS + desc: in the Main Menu -> System screen + user: core + + *: "Credits" + + + *: "Bidragsytarar" + + + *: "Bidragsytarar" + + + + id: LANG_SORT_INTERPRET_NUMBERS + desc: in Settings -> File view + user: core + + *: "Interpret numbers when sorting" + + + *: "Ved sortering, tolk tal som" + + + *: "Ved sortering tolk tal som" + + + + id: LANG_SORT_INTERPRET_AS_DIGIT + desc: in Settings -> File view + user: core + + *: "As digits" + + + *: "Siffer" + + + *: "Siffer" + + + + id: LANG_SORT_INTERPRET_AS_NUMBERS + desc: in Settings -> File view + user: core + + *: "As whole numbers" + + + *: "Heiltal" + + + *: "Heiltal" + + + + id: LANG_ENABLE_SPEAKER + desc: in Settings -> Sound Settings + user: core + + *: none + speaker: "Enable Speaker" + + + *: none + speaker: "Skru på høgtalar" + + + *: none + speaker: "Skru på høgtalar" + + + + id: LANG_TOUCHSCREEN_MODE + desc: in Settings -> General -> Display -> Touchscreen Settings + user: core + + *: none + touchscreen: "Touchscreen Mode" + + + *: none + touchscreen: "Peikeskjermmodus" + + + *: none + touchscreen: "Peikeskjermmodus" + + + + id: LANG_TOUCHSCREEN_GRID + desc: in Settings -> General -> Display -> Touchscreen Settings + user: core + + *: none + touchscreen: "3x3 Grid" + + + *: none + touchscreen: "3x3-gitter" + + + *: none + touchscreen: "3 gonger 3 gitter" + + + + id: LANG_TOUCHSCREEN_POINT + desc: in Settings -> General -> Display -> Touchscreen Settings + user: core + + *: none + touchscreen: "Absolute Point" + + + *: none + touchscreen: "Absolutt punkt" + + + *: none + touchscreen: "Absolutt punkt" + + + + id: LANG_PREVENT_SKIPPING + desc: in Settings -> Playback Settings + user: core + + *: "Prevent Track Skipping" + + + *: "Hindra sporhopping" + + + *: "Hindra sporhopping" + + + + id: LANG_TIMESTRETCH + desc: timestretch enable + user: core + + *: "Timestretch" + + + *: "Strekk tid" + + + *: "Strekk tid" + + + + id: LANG_SPEED + desc: timestretch speed + user: core + + *: "Speed" + + + *: "Fart" + + + *: "Fart" + + + + id: LANG_TOUCHSCREEN_SETTINGS + desc: in Settings -> General -> Display menu + user: core + + *: none + touchscreen: "Touchscreen Settings" + + + *: none + touchscreen: "Peikeskjerminnstillingar" + + + *: none + touchscreen: "Peikeskjerminnstillingar" + + + + id: LANG_TOUCHSCREEN_CALIBRATE + desc: in Settings -> General -> Display -> Touchscreen Settings + user: core + + *: none + touchscreen: "Calibrate" + + + *: none + touchscreen: "Kalibrer" + + + *: none + touchscreen: "Kalibrer" + + + + id: LANG_TOUCHSCREEN_RESET_CALIBRATION + desc: in Settings -> General -> Display -> Touchscreen Settings + user: core + + *: none + touchscreen: "Reset Calibration" + + + *: none + touchscreen: "Nullstill kailbrering" + + + *: none + touchscreen: "Nullstill kalibrering" + + + + id: LANG_STATUSBAR_TOP + desc: in Settings -> General -> Display -> statusbar + user: core + + *: "Top" + + + *: "Toppen" + + + *: "Toppen" + + + + id: LANG_STATUSBAR_BOTTOM + desc: in Settings -> General -> Display -> statusbar + user: core + + *: "Bottom" + + + *: "Botnen" + + + *: "Botnen" + + + + id: LANG_REMOTE_STATUSBAR + desc: in Settings -> General -> Display -> statusbar + user: core + + *: none + remote: "Remote Statusbar" + + + *: none + remote: "Fjernstatusfelt" + + + *: none + remote: "Fjernstatusfelt" + + + + id: LANG_SEMITONE + desc: + user: core + + *: none + pitchscreen: "Semitone" + + + *: none + pitchscreen: "Halvtone" + + + *: none + pitchscreen: "Halvtone" + + + + id: LANG_STRETCH_LIMIT + desc: "limit" in pitch screen + user: core + + *: none + pitchscreen: "Limit" + + + *: none + pitchscreen: "Grense" + + + *: none + pitchscreen: "Grense" + + + + id: LANG_PLAYBACK_RATE + desc: "rate" in pitch screen + user: core + + *: none + pitchscreen: "Rate" + + + *: none + pitchscreen: "~Rate" + + + *: none + pitchscreen: "~Rate" + + + + id: LANG_USB_KEYPAD_MODE + desc: in settings_menu + user: core + + *: none + usb_hid: "USB Keypad Mode" + + + *: none + usb_hid: "USB-tastaturmodus" + + + *: none + usb_hid: "U S B tastaturmodus" + + + + id: LANG_MULTIMEDIA_MODE + desc: in settings_menu + user: core + + *: none + usb_hid: "Multimedia" + + + *: none + usb_hid: "~Multimedia" + + + *: none + usb_hid: "~Multimedia" + + + + id: LANG_PRESENTATION_MODE + desc: in settings_menu + user: core + + *: none + usb_hid: "Presentation" + + + *: none + usb_hid: "Presentasjon" + + + *: none + usb_hid: "Presentasjon" + + + + id: LANG_BROWSER_MODE + desc: in settings_menu + user: core + + *: none + usb_hid: "Browser" + + + *: none + usb_hid: "Lesar" + + + *: none + usb_hid: "Lesar" + + + + id: LANG_MOUSE_MODE + desc: in settings_menu + user: core + + *: none + usb_hid: "Mouse" + + + *: none + usb_hid: "Mus" + + + *: none + usb_hid: "Mus" + + + + id: LANG_USB_DAC + desc: in settings_menu + user: core + + *: none + usbdac: "USB-DAC" + + + *: none + usbdac: "~USB-DAC" + + + *: none + usbdac: "U S B digital lydomformar" + + + + id: LANG_WHILE_USB_CHARGE_ONLY + desc: in settings_menu + user: core + + *: none + usbdac: "While In USB Charge-Only Mode" + + + *: none + usbdac: "While In USB Charge-Only Mode" + + + *: none + usbdac: "While In USB Charge-Only Mode" + + + + id: LANG_WHILE_MASS_STORAGE_USB_ONLY + desc: in settings_menu + user: core + + *: none + usbdac: "While In USB Mass-Storage Mode" + + + *: none + usbdac: "Når USB-masselagringsmodus er i bruk" + + + *: none + usbdac: "Når U S B masselagringsmodus er i bruk" + + + + id: LANG_USB_DAC_ACTIVE + desc: for splash + user: core + + *: none + usbdac: "USB-DAC Active" + + + *: none + usbdac: "USB-DAC aktiv" + + + *: none + usbdac: "U S B digital lydomformar aktiv" + + + + id: LANG_SCROLLBAR_WIDTH + desc: in Settings -> General -> Display -> Status-/Scrollbar + user: core + + *: "Scroll Bar Width" + + + *: "Breidd på rullefeltet" + + + *: "Breidd på rullefeltet" + + + + id: LANG_COMPRESSOR + desc: in sound settings + user: core + + *: "Compressor" + + + *: "Kompressor" + + + *: "Kompressor" + + + + id: LANG_TOP_QS_ITEM + desc: used for the submenu name for the quickscreen items + user: core + + *: none + quickscreen: "Set as Top Quickscreen Item" + + + *: none + quickscreen: "Bruk som øvre snøggskjermelement" + + + *: none + quickscreen: "Bruk som øvre snøggskjermelement" + + + + id: LANG_FM_ITALY + desc: fm region Italy + user: core + + *: none + radio: "Italy" + + + *: none + radio: "Italia" + + + *: none + radio: "Italia" + + + + id: LANG_FM_OTHER + desc: Catch-all FM region. Select if none of the others work + user: core + + *: none + radio: "Other" + + + *: none + radio: "Andre" + + + *: none + radio: "Andre" + + + + id: LANG_COMPRESSOR_THRESHOLD + desc: in sound settings + user: core + + *: "Threshold" + + + *: "Terskel" + + + *: "Terskel" + + + + id: LANG_COMPRESSOR_RATIO + desc: in sound settings + user: core + + *: "Ratio" + + + *: "Rate" + + + *: "Rate" + + + + id: LANG_COMPRESSOR_RATIO_2 + desc: in sound settings + user: core + + *: "2:1" + + + *: "~2:1" + + + *: "2 til 1" + + + + id: LANG_COMPRESSOR_RATIO_4 + desc: in sound settings + user: core + + *: "4:1" + + + *: "~4:1" + + + *: "4 til 1" + + + + id: LANG_COMPRESSOR_RATIO_6 + desc: in sound settings + user: core + + *: "6:1" + + + *: "~6:1" + + + *: "6 til 1" + + + + id: LANG_COMPRESSOR_RATIO_10 + desc: in sound settings + user: core + + *: "10:1" + + + *: "~10:1" + + + *: "10 til 1" + + + + id: LANG_COMPRESSOR_RATIO_LIMIT + desc: in sound settings + user: core + + *: "Limit" + + + *: "Avgrens" + + + *: "Avgrens" + + + + id: LANG_COMPRESSOR_GAIN + desc: in sound settings + user: core + + *: "Makeup Gain" + + + *: "Kompensasjonsvolum" + + + *: "Kompensasjonsvolum" + + + + id: LANG_AUTO + desc: in sound settings + user: core + + *: "Auto" + + + *: "~Auto" + + + *: "~Auto" + + + + id: LANG_COMPRESSOR_KNEE + desc: in sound settings + user: core + + *: "Knee" + + + *: "Kne" + + + *: "Kne" + + + + id: LANG_COMPRESSOR_HARD_KNEE + desc: in sound settings + user: core + + *: "Hard Knee" + + + *: "Hardt kne" + + + *: "Hardt kne" + + + + id: LANG_COMPRESSOR_SOFT_KNEE + desc: in sound settings + user: core + + *: "Soft Knee" + + + *: "Mjukt kne" + + + *: "Mjukt kne" + + + + id: LANG_COMPRESSOR_ATTACK + desc: in sound settings + user: core + + *: "Attack Time" + + + *: "Starttid" + + + *: "Starttid" + + + + id: LANG_COMPRESSOR_RELEASE + desc: in sound settings + user: core + + *: "Release Time" + + + *: "Slepptid" + + + *: "Slepptid" + + + + id: LANG_SKIP_OUTRO + desc: skipping to the 5 seconds before the end of a track + user: core + + *: "Skip to Outro" + + + *: "Hopp til avslutninga" + + + *: "Hopp til avslutninga" + + + + id: VOICE_EXT_SBS + desc: spoken only, for file extension + user: core + + *: "" + + + *: "" + + + *: "statusfelt-drakt" + + + + id: VOICE_EXT_RSBS + desc: spoken only, for file extension + user: core + + *: none + remote: "" + + + *: none + remote: "" + + + *: none + remote: "fjern statusfelt-drakt" + + + + id: LANG_USB_HID + desc: in settings_menu + user: core + + *: none + usb_hid: "USB HID" + + + *: none + usb_hid: "~USB HID" + + + *: none + usb_hid: "USB grensesnitteining" + + + + id: LANG_QUEUE_LAST_SHUFFLED + desc: in onplay menu. queue a playlist randomly at end of dynamic playlist + user: core + + *: "Queue Last Shuffled" + + + *: "Set siste tilfeldige i kø" + + + *: "Set siste tilfeldige i kø" + + + + id: LANG_MORSE_INPUT + desc: in Settings -> System + user: core + + *: none + morse_input: "Use Morse Code Input" + + + *: none + morse_input: "Bruk morse-innputt" + + + *: none + morse_input: "Bruk morse-innputt" + + + + id: LANG_AUTOTRACKSKIP + desc: in crossfade settings + user: core + + *: none + crossfade: "Automatic Track Change Only" + + + *: none + crossfade: "Berre automatisk sporbyte" + + + *: none + crossfade: "Berre automatisk sporbyte" + + + + id: LANG_NEXT_TRACK + desc: Shown in WPS + user: core + + *: "Next Track:" + + + *: "Neste spor:" + + + *: "Neste spor" + + + + id: LANG_NEXT + desc: Shown in WPS (short form of Next Track) + user: core + + *: "Next:" + + + *: "Neste:" + + + *: "Neste" + + + + id: LANG_OF + desc: Shown in WPS: X of Y (tracks) + user: core + + *: "of" + + + *: "av" + + + *: "av" + + + + id: LANG_DISC + desc: Shown in WPS (for multidisc albums) + user: core + + *: "Disc" + + + *: "Disk" + + + *: "Disk" + + + + id: LANG_BASE_SKIN + desc: browse for the base skin in theme settings + user: core + + *: "Base Skin" + + + *: "Grunndrakt" + + + *: "Grunndrakt" + + + + id: LANG_REMOTE_BASE_SKIN + desc: browse for the base skin in theme settings + user: core + + *: "Remote Base Skin" + + + *: "Fjern grunndrakt" + + + *: "Fjern grunndrakt" + + + + id: LANG_MAIN_SCREEN + desc: in the main menu + user: core + + *: none + remote: "Main Screen" + + + *: none + remote: "Hovudskjerm" + + + *: none + remote: "Hovudskjerm" + + + + id: LANG_REMOTE_SCREEN + desc: in the main menu + user: core + + *: none + remote: "Remote Screen" + + + *: none + remote: "Fjernskjerm" + + + *: none + remote: "Fjernskjerm" + + + + id: LANG_HISTOGRAM_INTERVAL + desc: in record settings menu + user: core + + *: none + histogram: "Histogram interval" + + + *: none + histogram: "Histogramintervall" + + + *: none + histogram: "Histogramintervall" + + + + id: LANG_HOTKEY + desc: hotkey menu + user: core + + *: none + hotkey: "Hotkey" + + + *: none + hotkey: "Snøggtast" + + + *: none + hotkey: "Snøggtast" + + + + id: LANG_HOTKEY_WPS + desc: hotkey menu + user: core + + *: none + hotkey: "WPS Hotkey" + + + *: none + hotkey: "Speleskjerm-snøggtast" + + + *: none + hotkey: "Speleskjermsnøggtast" + + + + id: LANG_HOTKEY_FILE_BROWSER + desc: hotkey menu + user: core + + *: none + hotkey: "File Browser Hotkey" + + + *: none + hotkey: "Filhandterar-snøggtast" + + + *: none + hotkey: "Filhandterarsnøggtast" + + + + id: LANG_RESUME_REWIND + desc: in playback settings menu + user: core + + *: "Rewind Before Resume" + + + *: "Spol tilbake før vidarespeling" + + + *: "Spol tilbake før vidarespeling" + + + + id: LANG_REMOTE_RADIOSCREEN + desc: in the theme menu + user: core + + *: none + radio_remote: "Remote Radio Screen" + + + *: none + radio_remote: "Fjernradioskjerm" + + + *: none + radio_remote: "Fjernradioskjerm" + + + + id: VOICE_EXT_FMS + desc: spoken only, for file extension + user: core + + *: none + radio: "" + + + *: none + radio: "" + + + *: none + radio: "radioskjermdrakt" + + + + id: VOICE_EXT_RFMS + desc: spoken only, for file extension + user: core + + *: none + radio_remote: "" + + + *: none + radio_remote: "" + + + *: none + radio_remote: "drakt for fjernradioskjerm" + + + + id: LANG_FM_STATION_HEADER + desc: in radio screen + user: core + + *: none + radio: "Station:" + + + *: none + radio: "Stasjon:" + + + *: none + radio: "" + + + + id: LANG_HW_EQ_TONE_CONTROLS + desc: in sound_menu, hardware equalizer tone controls + user: core + + *: none + gigabeats,samsungypr1: "Tone Controls" + + + *: none + gigabeats,samsungypr1: "Tonekontrollar" + + + *: none + gigabeats,samsungypr1: "Tonekontrollar" + + + + id: LANG_HW_EQ_TONE_CONTROLS_ADVANCED + desc: in sound_menu, advanced settings for hardware equalizer tone controls + user: core + + *: none + gigabeats,samsungypr1: "Advanced Tone Control Settings" + + + *: none + gigabeats,samsungypr1: "Avanserte tonekontrollar" + + + *: none + gigabeats,samsungypr1: "Avanserte tonekontrollar" + + + + id: LANG_HW_EQ_GAIN + desc: in sound_menu, hardware equalizer tone controls filter gain + user: core + + *: none + gigabeats,samsungypr1: "Band %d Gain" + + + *: none + gigabeats,samsungypr1: "Band %d volum" + + + *: none + gigabeats,samsungypr1: "Bandvolum" + + + + id: LANG_HW_EQ_FREQUENCY + desc: in sound_menu, hardware equalizer tone controls shelf filter cutoff frequency + user: core + + *: none + gigabeats,samsungypr1: "Band %d Frequency" + + + *: none + gigabeats,samsungypr1: "Band %d frekvens" + + + *: none + gigabeats,samsungypr1: "Bandfrekvens" + + + + id: LANG_HW_EQ_WIDTH + desc: in sound_menu, hardware equalizer tone controls peak bandwith setting + user: core + + *: none + gigabeats,samsungypr1: "Band %d Width" + + + *: none + gigabeats,samsungypr1: "Band %d breidd" + + + *: none + gigabeats,samsungypr1: "Bandbreidd" + + + + id: LANG_HW_EQ_WIDTH_NARROW + desc: in sound_menu, hardware equalizer tone controls narrow bandwith setting + user: core + + *: none + gigabeats,samsungypr1: "Narrow" + + + *: none + gigabeats,samsungypr1: "Smal" + + + *: none + gigabeats,samsungypr1: "Smal" + + + + id: LANG_HW_EQ_WIDTH_WIDE + desc: in sound_menu, hardware equalizer tone controls wide bandwidth setting + user: core + + *: none + gigabeats,samsungypr1: "Wide" + + + *: none + gigabeats,samsungypr1: "Brei" + + + *: none + gigabeats,samsungypr1: "Brei" + + + + id: LANG_DEPTH_3D + desc: in sound_menu, amount of 3D enhancement effect + user: core + + *: none + depth_3d: "3-D Enhancement" + + + *: none + depth_3d: "3D-utviding" + + + *: none + depth_3d: "3 D utviding" + + + + id: LANG_TAGNAVI_UNTAGGED + desc: "[untagged]" entry in tag browser + user: core + + *: "[Untagged]" + + + *: "[Umerka]" + + + *: "Umerka" + + + + id: LANG_RADIOSCREEN + desc: in the theme menu + user: core + + *: none + radio: "Radio Screen" + + + *: none + radio: "Radioskjerm" + + + *: none + radio: "Radioskjerm" + + + + id: LANG_ID3_COMPOSER + desc: in tag viewer + user: core + + *: "Composer" + + + *: "Komponist" + + + *: "Komponist" + + + + id: LANG_FORCE + desc: alternative to yes/no for tristate settings + user: core + + *: "Force" + + + *: "Tving" + + + *: "Tving" + + + + id: LANG_ONPLAY_PICTUREFLOW + desc: Onplay pictureflow + user: core + + *: "PictureFlow" + + + *: "Biletflyt" + + + *: "Opna biletflyt" + + + + id: LANG_KBD_OK + desc: in keyboard + user: core + + *: none + touchscreen: "OK" + + + *: none + touchscreen: "~OK" + + + *: none + touchscreen: "~OK" + + + + id: LANG_KBD_DELETE + desc: in keyboard + user: core + + *: none + touchscreen: "Del" + + + *: none + touchscreen: "~Del" + + + *: none + touchscreen: "~Del" + + + + id: LANG_KBD_CANCEL + desc: in keyboard + user: core + + *: none + touchscreen: "Cancel" + + + *: none + touchscreen: "Avbryt" + + + *: none + touchscreen: "Avbryt" + + + + id: LANG_BOOKMARK_SETTINGS_AUTOUPDATE + desc: prompt for user to decide whether to update bookmarks + user: core + + *: "Update on Stop" + + + *: "Oppdater ved stopp" + + + *: "Oppdater ved stopp" + + + + id: LANG_RESET_START_DIR + desc: reset the browser start directory + user: core + + *: "Start File Browser at /" + + + *: "Start fillesaren på /" + + + *: "Start fillesaren i rotmappa" + + + + id: LANG_FM_RSSI + desc: Signal strength of a received FM station + user: core + + *: none + radio: "Signal strength:" + + + *: none + radio: "Signalstyrke:" + + + *: none + radio: "Signalstyrke" + + + + id: LANG_AUTORESUME + desc: resume settings menu + user: core + + *: "Automatic Resume" + + + *: "Automatisk framhald" + + + *: "Automatisk framhald" + + + + id: LANG_AUTORESUME_AUTOMATIC + desc: resume on automatic track change + user: core + + *: "Resume on automatic track change" + + + *: "Hald fram automatisk ved sporbyte" + + + *: "Hald fram automatisk ved sporbyte" + + + + id: LANG_AUTORESUME_CUSTOM + desc: enable customization of resume on automatic track change + user: core + + *: "In custom directories only" + + + *: "Berre i eigne mapper" + + + *: "Berre i eigne mapper" + + + + id: LANG_PAUSE_REWIND + desc: Seconds to rewind when rewind on pause is enabled. + user: core + + *: "Rewind on Pause" + + + *: "Spol tilbake ved pause" + + + *: "Spol tilbake ved pause" + + + + id: LANG_RESET_PLAYLISTCAT_DIR + desc: + user: core + + *: "Reset Playlist Catalogue Directory" + + + *: "Nullstill spelelistekatalogmappa" + + + *: "Nullstill spelelistekatalogmappa" + + + + id: LANG_CURRENT_PLAYLIST + desc: Used when you need to say playlist, also voiced + user: core + + *: "Current Playlist" + + + *: "Noverande spelelister" + + + *: "Noverande spelelister" + + + + id: LANG_SAVE_CHANGES + desc: When you try to exit screens to confirm save + user: core + + *: "Save Changes?" + + + *: "Lagre endringar?" + + + *: "Lagre endringar?" + + + + id: LANG_USB_SKIP_FIRST_DRIVE + desc: in settings_menu + user: core + + *: none + multidrive_usb: "USB Hide Internal Drive" + + + *: none + multidrive_usb: "USB gøym intern disk" + + + *: none + multidrive_usb: "U S B gøym intern disk" + + + + id: LANG_LIST_LINE_PADDING + desc: list padding, in display settings + user: core + + *: none + touchscreen: "Line Padding in Lists" + + + *: none + touchscreen: "Mellomrom i lister" + + + *: none + touchscreen: "Mellomrom i lister" + + + + id: LANG_SLEEP_TIMER_DURATION + desc: default sleep timer duration in minutes + user: core + + *: "Default Sleep Timer Duration" + + + *: "Standardnedteljing for dvalefunksjon" + + + *: "Standardnedteljing for dvalefunksjon" + + + + id: LANG_SLEEP_TIMER_ON_POWER_UP + desc: whether sleep timer starts on power up + user: core + + *: "Start Sleep Timer on Boot" + + + *: "Start dvalenedteljing ved oppstart" + + + *: "Start dvalenedteljing ved oppstart" + + + + id: LANG_SLEEP_TIMER_CANCEL_CURRENT + desc: shown instead of sleep timer when it's running + user: core + + *: "Cancel Sleep Timer" + + + *: "Avbryt dvalenedteljinga" + + + *: "Avbryt dvalenedteljinga" + + + + id: LANG_LIST_SEPARATOR + desc: line between lines in lists + user: core + + *: "Line Separator" + + + *: "Linedeling" + + + *: "Linedeling" + + + + id: LANG_LIST_SEPARATOR_COLOR + desc: line between lines in lists + user: core + + *: "Line Separator Colour" + + + *: "Farge på linedeling" + + + *: "Farge på linedeling" + + + + id: LANG_SHORTCUTS + desc: Title in the shortcuts menu + user: core + + *: "Shortcuts" + + + *: "Snarvegar" + + + *: "Snarvegar" + + + + id: LANG_KEYCLICK_SOFTWARE + desc: in keyclick settings menu + user: core + + *: none + hardware_click: "Headphone Keyclick" + + + *: none + hardware_click: "Klikkelyd i øyretelefonar" + + + *: none + hardware_click: "Klikkelyd i øyretelefonar" + + + + id: LANG_KEYCLICK_HARDWARE + desc: in keyclick settings menu + user: core + + *: none + hardware_click: "Speaker Keyclick" + + + *: none + hardware_click: "Klikkelyd i høgtalar" + + + *: none + hardware_click: "Klikkelydi høgtalar" + + + + id: LANG_GLYPHS + desc: in settings_menu + user: core + + *: "Glyphs To Cache" + + + *: "Teikn å mellomlagra" + + + *: "Teikn å mellomlagra" + + + + id: LANG_STARTUP_SHUTDOWN + desc: in the general settings menu + user: core + + *: "Startup/Shutdown" + + + *: "Oppstart/avslutning" + + + *: "Oppstart og avslutning" + + + + id: LANG_KEYPRESS_RESTARTS_SLEEP_TIMER + desc: whether to restart running sleep timer on keypress + user: core + + *: "Restart Sleep Timer on Keypress" + + + *: "Nullstill dvalenedteljinga når du trykkjer ein knapp" + + + *: "Nullstill dvalenedteljinga når du trykkjer ein knapp" + + + + id: LANG_CONSTRAIN_NEXT_FOLDER + desc: in settings_menu. Whether LANG_NEXT_FOLDER should be constrained to directories within LANG_SET_AS_START_DIR + user: core + + *: "Constrain Auto-Change" + + + *: "Avgrens autoendring" + + + *: "Avgrens autoendring" + + + + id: LANG_USE_SHORTCUTS_INSTEAD_OF_QS + desc: in settings_menu. + user: core + + *: none + quickscreen: "Use Shortcuts Menu Instead of Quick Screen" + + + *: none + quickscreen: "Bruk snøggtastmenyen i staden for snøggskjerm" + + + *: none + quickscreen: "Bruk snøggtastmenyen i staden for snøggskjerm" + + + + id: LANG_SLEEP_TIMER_START_CURRENT + desc: shown when a sleep timer isn't running + user: core + + *: "Start Sleep Timer" + + + *: "Start dvalenedteljinga" + + + *: "Start dvalenedteljinga" + + + + id: LANG_CODEPAGE_WESTERN_EUROPEAN + desc: in codepage setting menu + user: core + + *: "Western European (CP1252)" + + + *: "Vesteuropeisk (CP1252)" + + + *: "Vesteuropeisk" + + + + id: LANG_CROSSFEED_MEIER + desc: in sound settings + user: core + + *: "Simple (Meier)" + + + *: "Enkel (Meier)" + + + *: "Enkel" + + + + id: LANG_CROSSFEED_CUSTOM + desc: in sound settings + user: core + + *: "Custom" + + + *: "Eiga" + + + *: "Eiga" + + + + id: LANG_SELECT_FOLDER + desc: in settings_menu + user: core + + *: "Select one or more directories" + + + *: "Vel ei eller fleire mapper" + + + *: "Vel ei eller fleire mapper" + + + + id: LANG_SELECT_DATABASE_DIRS + desc: in settings_menu + user: core + + *: "Select directories to scan" + + + *: "Vel mapper å søkja gjennom" + + + *: "Vel mapper å søkja gjennom" + + + + id: LANG_FILTER_ROLL_OFF + desc: in sound settings + user: core + + *: none + filter_roll_off: "DAC filter roll-off" + + + *: none + filter_roll_off: "Avtoning for DAC-filter" + + + *: none + filter_roll_off: "Avtoning for D A C filter" + + + + id: LANG_FILTER_SHARP + desc: in sound settings + user: core + + *: none + filter_roll_off: "Sharp" + + + *: none + filter_roll_off: "Krapp" + + + *: none + filter_roll_off: "Krapp" + + + + id: LANG_FILTER_SLOW + desc: in sound settings + user: core + + *: none + filter_roll_off: "Slow" + + + *: none + filter_roll_off: "Sein" + + + *: none + filter_roll_off: "Sein" + + + + id: LANG_FILTER_SHORT_SHARP + desc: in sound settings + user: core + + *: none + filter_roll_off: "Short Sharp" + + + *: none + filter_roll_off: "Kort krapp" + + + *: none + filter_roll_off: "Kort krapp" + + + + id: LANG_FILTER_SHORT_SLOW + desc: in sound settings + user: core + + *: none + filter_roll_off: "Short Slow" + + + *: none + filter_roll_off: "Kort sein" + + + *: none + filter_roll_off: "Kort sein" + + + + id: LANG_FILTER_SUPER_SLOW + desc: in sound settings + user: core + + *: none + filter_roll_off: "Super Slow" + + + *: none + filter_roll_off: "Veldig sein" + + + *: none + filter_roll_off: "Veldig sein" + + + + id: LANG_FILTER_SHORT + desc: in sound settings + user: core + + *: none + es9018: "Short" + + + *: none + es9018: "Kort" + + + *: none + es9018: "Kort" + + + + id: LANG_FILTER_BYPASS + desc: in sound settings + user: core + + *: none + es9018: "Bypass" + + + *: none + es9018: "Forbikopla" + + + *: none + es9018: "Forbikopla" + + + + id: LANG_FILTER_LINEAR_FAST + desc: in sound settings + user: core + + *: none + es9218: "Linear Fast" + + + *: none + es9218: "Lineær rask" + + + *: none + es9218: "Lineær rask" + + + + id: LANG_FILTER_LINEAR_SLOW + desc: in sound settings + user: core + + *: none + es9218: "Linear Slow" + + + *: none + es9218: "Lineær sein" + + + *: none + es9218: "Lineær sein" + + + + id: LANG_FILTER_MINIMUM_FAST + desc: in sound settings + user: core + + *: none + es9218: "Minimum Fast" + + + *: none + es9218: "Minimum rask" + + + *: none + es9218: "Minimum rask" + + + + id: LANG_FILTER_MINIMUM_SLOW + desc: in sound settings + user: core + + *: none + es9218: "Minimum Slow" + + + *: none + es9218: "Minimum sein" + + + *: none + es9218: "Minimum sein" + + + + id: LANG_FILTER_APODIZING_1 + desc: in sound settings + user: core + + *: none + es9218: "Apodizing type 1" + + + *: none + es9218: "Apodisering type 1" + + + *: none + es9218: "Apodisering type 1" + + + + id: LANG_FILTER_APODIZING_2 + desc: in sound settings + user: core + + *: none + es9218: "Apodizing type 2" + + + *: none + es9218: "Apodisering type 2" + + + *: none + es9218: "Apodisering type 2" + + + + id: LANG_FILTER_HYBRID_FAST + desc: in sound settings + user: core + + *: none + es9218: "Hybrid Fast" + + + *: none + es9218: "Hybrid rask" + + + *: none + es9218: "Hybrid rask" + + + + id: LANG_FILTER_BRICK_WALL + desc: in sound settings + user: core + + *: none + es9218: "Brick Wall" + + + *: none + es9218: "Murvegg" + + + *: none + es9218: "Murvegg" + + + + id: LANG_DAC_POWER_MODE + desc: in sound settings + user: core + + *: none + dac_power_mode: "DAC power mode" + es9218: "DAC output level" + + + *: none + dac_power_mode: "DAC-straummodus" + es9218: "DAC-utgangsnivå" + + + *: none + dac_power_mode: "D A C straummodus" + es9218: "D A C utgangsnivå" + + + + id: LANG_DAC_POWER_HIGH + desc: in sound settings + user: core + + *: none + dac_power_mode: "High performance" + es9218: "High Gain (2 Vrms)" + + + *: none + dac_power_mode: "Høg yting" + es9218: "Høgt volum (2V rms)" + + + *: none + dac_power_mode: "Høg yting" + es9218: "Høgt volum 2 volt R M S" + + + + id: LANG_DAC_POWER_LOW + desc: in sound settings + user: core + + *: none + dac_power_mode: "Save battery" + es9218: "Low Gain (1 Vrms)" + + + *: none + dac_power_mode: "Spar batteriet" + es9218: "Lågt volum (1V rms)" + + + *: none + dac_power_mode: "Spar batteriet" + es9218: "Lågt volum 1 volt R M S" + + + + id: LANG_VOLUME_LIMIT + desc: in sound_settings + user: core + + *: "Maximum Volume Limit" + + + *: "Øvste volumgrense" + + + *: "Øvste volumgrense" + + + + id: LANG_PBE + desc: in sound settings + user: core + + *: "Perceptual Bass Enhancement" + + + *: "Oppfatta bassforsterking" + + + *: "Oppfatta bassforsterking" + + + + id: LANG_AFR + desc: in sound settings + user: core + + *: "Auditory Fatigue Reduction" + + + *: "Redusert høyrselsslitasje" + + + *: "Redusert høyrselsslitasje" + + + + id: LANG_SURROUND + desc: in the sound settings menu + user: core + + *: "Haas Surround" + + + *: "Haas-kringlyd" + + + *: "Haas kringlyd" + + + + id: LANG_SURROUND_FX1 + desc: in sound settings + user: core + + *: "f(x1)" + + + *: "f(x1)" + + + *: "F X 1" + + + + id: LANG_SURROUND_FX2 + desc: in sound settings + user: core + + *: "f(x2)" + + + *: "f(x2)" + + + *: "F X 2" + + + + id: LANG_SURROUND_METHOD2 + desc: in sound settings + user: core + + *: "SIDE ONLY" + + + *: "Berre sida" + + + *: "Berre sida" + + + + id: LANG_SURROUND_MIX + desc: in sound settings + user: core + + *: "Dry / Wet Mix" + + + *: "Tørr / våt-miks" + + + *: "Tørr våt miks" + + + + id: LANG_IBASSO_FREQ_SCALING_GOVERNOR + desc: in Settings -> General -> System -> Freq Scaling Governor + user: core + + *: none + ibassodx50,ibassodx90: "Freq Scaling Governor" + + + *: none + ibassodx50,ibassodx90: "Prosessorfrekvensstyring" + + + *: none + ibassodx50,ibassodx90: "Prosessorfrekvensstyring" + + + + id: LANG_USB_MODE + desc: in Settings -> General -> System -> USB Mode + user: core + + *: "USB Mode" + + + *: "USB-modus" + + + *: "U S B modus" + + + + id: LANG_USB_MODE_MASS_STORAGE + desc: in Settings -> General -> System -> USB Mode: Mass Storage + user: core + + *: "Mass Storage" + + + *: "Masselagring" + + + *: "Masselagring" + + + + id: LANG_USB_MODE_CHARGE + desc: in Settings -> General -> System -> USB Mode: Charge Only + user: core + + *: "Charge Only" + + + *: "Berre lading" + + + *: "Berre lading" + + + + id: LANG_USB_MODE_ADB + desc: in Settings -> General -> System -> USB Mode: Android Debug Bridge + user: core + + *: "Android Debug Bridge" + + + *: "Android Debug Bridge" + + + *: "Android Debug Bridge" + + + + id: LANG_ACTION_ENABLED + desc: Selective Actions + user: core + + *: "Enabled" + + + *: "På" + + + *: "På" + + + + id: LANG_ACTION_PLAY + desc: Selective Actions + user: core + + *: "Exempt Play" + + + *: "Unnteke speling" + + + *: "Unnteke speling" + + + + id: LANG_ACTION_SEEK + desc: Selective Actions + user: core + + *: "Exempt Seek" + + + *: "Unnteke spoling" + + + *: "Unnteke spoling" + + + + id: LANG_ACTION_SKIP + desc: Selective Actions + user: core + + *: "Exempt Skip" + + + *: "Unnteke hopping" + + + *: "Unnteke hopping" + + + + id: LANG_BACKLIGHT_SELECTIVE + desc: Backlight behaviour setting + user: core + + *: "Backlight Exemptions" + + + *: "Unntak for skjermlys" + + + *: "Unntak for skjermlys" + + + + id: LANG_ACTION_DISABLE_EXT_POWER + desc: Backlight behaviour setting + user: core + + *: "Disable on External Power" + + + *: "Skru av ved ekstern srtaum" + + + *: "Skru av ved ekstern straum" + + + + id: LANG_ACTION_DISABLE_UNMAPPED + desc: Backlight behaviour setting + user: core + + *: "Disable Unmapped Keys" + + + *: "Skru av ubrukte knappar" + + + *: "Skru av ubrukte knappar" + + + + id: LANG_SOFTLOCK_SELECTIVE + desc: Softlock behaviour setting + user: core + + *: "Advanced Key Lock" + + + *: "Avansert tastelås" + + + *: "Avansert tastelås" + + + + id: LANG_ACTION_AUTOLOCK_ON + desc: Softlock behaviour setting + user: core + + *: "Autolock On" + + + *: "Autolås på" + + + *: "Autolås på" + + + + id: LANG_ACTION_AUTOLOCK_OFF + desc: Softlock behaviour setting + user: core + + *: "Autolock Off" + + + *: "Autolås av" + + + *: "Autolås av" + + + + id: LANG_ACTION_DISABLE_NOTIFY + desc: Softlock behaviour setting + user: core + + *: "Disable Locked Reminders" + + + *: "Skru av påminningar om lås" + + + *: "Skru av påminningar om lås" + + + + id: LANG_ACTION_DISABLE_TOUCH + desc: Softlock behaviour setting + user: core + + *: "Disable Touch" + + + *: "Skru av peikeskjerm" + + + *: "Skru av peikeskjerm" + + + + id: LANG_KIBIBYTE + desc: a unit postfix, also voiced + user: core + + *: "KiB" + + + *: "KiB" + + + *: "kibibyte" + + + + id: LANG_MEBIBYTE + desc: a unit postfix, also voiced + user: core + + *: "MiB" + + + *: "MiB" + + + *: "mebibyte" + + + + id: LANG_GIBIBYTE + desc: a unit postfix, also voiced + user: core + + *: "GiB" + + + *: "GiB" + + + *: "gibibyte" + + + + id: LANG_BOOKMARK_SETTINGS_ONE_PER_PLAYLIST + desc: Save only one bookmark for a playlist in recent bookmarks + user: core + + *: "One per playlist" + + + *: "Eitt per speleliste" + + + *: "Eitt per speleliste" + + + + id: LANG_BOOKMARK_SETTINGS_ONE_PER_TRACK + desc: Save only one bookmark for a combination (playlist,track) in recent bookmarks + user: core + + *: "One per track" + + + *: "Eitt per spor" + + + *: "Eitt per spor" + + + + id: VOICE_TRACK_TO_MOVE + desc: playlist viewer + user: core + + *: "" + + + *: "" + + + *: "Spor å flytta" + + + + id: VOICE_QUEUED + desc: playlist viewer + user: core + + *: "" + + + *: "" + + + *: "I kø" + + + + id: VOICE_BAD_TRACK + desc: playlist viewer + user: core + + *: "" + + + *: "" + + + *: "Dårleg spor" + + + + id: VOICE_MOVING_TRACK + desc: playlist viewer + user: core + + *: "" + + + *: "" + + + *: "Flyttar spor" + + + + id: LANG_PLAYTIME_ELAPSED + desc: playing time screen + user: core + + *: "Playlist elapsed:" + + + *: "Spelt av spelelista:" + + + *: "Spelt av spelelista" + + + + id: LANG_PLAYTIME_TRK_ELAPSED + desc: playing time screen + user: core + + *: "Track elapsed:" + + + *: "Spelt av sporet:" + + + *: "Spelt av sporet" + + + + id: LANG_PLAYTIME_TRK_REMAINING + desc: playing time screen + user: core + + *: "Track remaining:" + + + *: "Att av sporet:" + + + *: "Att av sporet" + + + + id: LANG_PLAYTIME_TRACK + desc: playing time screen + user: core + + *: "Track:" + + + *: "Spor:" + + + *: "Spor" + + + + id: LANG_PLAYTIME_STORAGE + desc: playing time screen + user: core + + *: "Storage (Done / Remaining):" + + + *: "Lagring (utført/attståande)" + + + *: "Lagring" + + + + id: VOICE_PLAYTIME_DONE + desc: playing time screen + user: core + + *: "" + + + *: "" + + + *: "Ferdig" + + + + id: LANG_PLAYTIME_AVG_TRACK_SIZE + desc: playing time screen + user: core + + *: "Average track size:" + + + *: "Gjennomsnittsstorleik på spor" + + + *: "Gjennomsnittsstorleik på spor" + + + + id: LANG_PLAYTIME_AVG_BITRATE + desc: playing time screen + user: core + + *: "Average bitrate:" + + + *: "Gjennomsnittsbitrate" + + + *: "Gjennomsnittsbitrate" + + + + id: LANG_PLAYING_TIME + desc: onplay menu + user: core + + *: "Playing time" + + + *: "Speletid" + + + *: "Speletid" + + + + id: LANG_CAR_ADAPTER_MODE_DELAY + desc: Displayed for setting car adapter mode delay + user: core + + *: none + charging: "Delay Before Resume" + + + *: none + charging: "Forseinking før vidarespeling" + + + *: none + charging: "Forseinking før vidarespeling" + + + + id: VOICE_PITCH_ABSOLUTE_MODE + desc: spoken only + user: core + + *: none + pitchscreen: "" + + + *: none + pitchscreen: "" + + + *: none + pitchscreen: "Absolutt modus" + + + + id: VOICE_PITCH_SEMITONE_MODE + desc: spoken only + user: core + + *: none + pitchscreen: "" + + + *: none + pitchscreen: "" + + + *: none + pitchscreen: "Halvtonemodus" + + + + id: VOICE_PITCH_TIMESTRETCH_MODE + desc: spoken only + user: core + + *: none + pitchscreen: "" + + + *: none + pitchscreen: "" + + + *: none + pitchscreen: "Tidsstrekking" + + + + id: LANG_REMOTE_CONTROL + desc: Item for menus + user: core + + *: "Remote Control" + + + *: "Fjernkontroll" + + + *: "Fjernkontroll" + + + + id: LANG_NO_REM_CONTROL + desc: Item for menus + user: core + + *: "No Rem. Control" + + + *: "Ingen fjernkontroll" + + + *: "Ingen fjernkontroll" + + + + id: LANG_OUT_OF_CONTROL + desc: Item for menus + user: core + + *: "Out of Control" + + + *: "Ute av kontroll" + + + *: "Ute av kontroll" + + + + id: LANG_2_KEY_CONTROL + desc: Item for menus + user: core + + *: "2 Key Control" + + + *: "2-tast-kontroll" + + + *: "2-tast-kontroll" + + + + id: LANG_4_KEY_CONTROL + desc: Item for menus + user: core + + *: "4 Key Control" + + + *: "4-tast-kontroll" + + + *: "4-tast-kontroll" + + + + id: LANG_PLAY_WORMLET + desc: For wormlet menu + user: core + + *: "Play Wormlet!" + + + *: "Spel Wormlet" + + + *: "Spel Wormlet!" + + + + id: LANG_NUMBER_OF_WORMS + desc: For wormlet menu + user: core + + *: "Number of Worms" + + + *: "Tal på ormar" + + + *: "Tal på ormar" + + + + id: LANG_WORM_GROWTH_PER_FOOD + desc: For wormlet menu + user: core + + *: "Worm Growth Per Food" + + + *: "Vekst per mat" + + + *: "Vekst per mat" + + + + id: LANG_WORM_SPEED + desc: For wormlet menu + user: core + + *: "Worm Speed" + + + *: "Fart på ormen" + + + *: "Fart på ormen" + + + + id: LANG_ARGHS_PER_FOOD + desc: For wormlet menu + user: core + + *: "Arghs Per Food" + + + *: "Argh per mat" + + + *: "Argh per mat" + + + + id: LANG_ARGH_SIZE + desc: For wormlet menu + user: core + + *: "Argh Size" + + + *: "Storleik på argh" + + + *: "Storleik på argh" + + + + id: LANG_FOOD_SIZE + desc: For wormlet menu + user: core + + *: "Food Size" + + + *: "Storleik på mat" + + + *: "Storleik på mat" + + + + id: LANG_NUMBER_OF_PLAYERS + desc: For game menus + user: core + + *: "Number of Players" + + + *: "Kor mange spelarar" + + + *: "Kor mange spelarar" + + + + id: LANG_CONTROL_STYLE + desc: In various menus + user: core + + *: "Control Style" + + + *: "Kontrollstil" + + + *: "Kontrollstil" + + + + id: LANG_REVERT_TO_DEFAULT_SETTINGS + desc: In various menus + user: core + + *: "Revert to Default Settings" + + + *: "Nullstill til standard" + + + *: "Nullstill til standard" + + + + id: LANG_MENU_QUIT + desc: in various menus + user: core + + *: "Quit" + + + *: "Avslutt" + + + *: "Avslutt" + + + + id: LANG_MENU_DISPLAY_OPTIONS + desc: in various menus + user: core + + *: "Display Options" + + + *: "Visingsval" + + + *: "Visingsval" + + + + id: LANG_PREVTRACK + desc: in playback control menu + user: core + + *: "Previous Track" + + + *: "Førre spor" + + + *: "Førre spor" + + + + id: LANG_PLAYPAUSE + desc: in playback control menu + user: core + + *: "Pause / Play" + + + *: "Pause / spel" + + + *: "Pause / spel" + + + + id: LANG_STOP_PLAYBACK + desc: in playback control menu + user: core + + *: "Stop Playback" + + + *: "Stopp avspeling" + + + *: "Stopp avspeling" + + + + id: LANG_NEXTTRACK + desc: in playback control menu + user: core + + *: "Next Track" + + + *: "Neste spor" + + + *: "Neste spor" + + + + id: LANG_CHANGE_VOLUME + desc: in playback control menu + user: core + + *: "Change Volume" + + + *: "Endra volum" + + + *: "Endra volum" + + + + id: LANG_CHANGE_SHUFFLE_MODE + desc: in playback control menu + user: core + + *: "Shuffle Mode" + + + *: "Tilfeldig modus" + + + *: "Tilfeldig modus" + + + + id: LANG_CHANGE_REPEAT_MODE + desc: in playback control menu + user: core + + *: "Change Repeat Mode" + + + *: "Endre repetisjonsmodus" + + + *: "Endre repetisjonsmodus" + + + + id: LANG_PLAYBACK_CONTROL + desc: in playback control menu + user: core + + *: "Playback Control" + + + *: "Avspelingskontroll" + + + *: "Avspelingskontroll" + + + + id: LANG_CHESSBOX_CHECKMATE + desc: in chessbox + user: core + + *: "Checkmate!" + + + *: "Sjakk matt!" + + + *: "Sjakk matt!" + + + + id: LANG_CHESSBOX_ILLEGAL_MOVE + desc: in chessbox + user: core + + *: "Illegal move!" + + + *: "Ulovleg trekk!" + + + *: "Ulovleg trekk!" + + + + id: LANG_CHESSBOX_MENU_NEW_GAME + desc: in the chessbox menu + user: core + + *: "New Game" + + + *: "Nytt spel" + + + *: "Nytt spel" + + + + id: LANG_CHESSBOX_MENU_RESUME_GAME + desc: in the chessbox menu + user: core + + *: "Resume Game" + + + *: "Hald fram spel" + + + *: "Hald fram spel" + + + + id: LANG_CHESSBOX_MENU_SAVE_GAME + desc: in the chessbox menu + user: core + + *: "Save Game" + + + *: "Lagra spelet" + + + *: "Lagra spelet" + + + + id: LANG_CHESSBOX_MENU_RESTORE_GAME + desc: in the chessbox menu + user: core + + *: "Restore Game" + + + *: "Hent fram spel" + + + *: "Hent fram spel" + + + + id: LANG_CHESSBOX_MENU_RESTART_GAME + desc: in the chessbox menu + user: core + + *: "Restart Game" + + + *: "Start spelet på nytt" + + + *: "Start spelet på nytt" + + + + id: LANG_CHESSBOX_MENU_SELECT_OTHER_GAME + desc: in the chessbox menu + user: core + + *: "Select Other Game" + + + *: "Vel eit anna spel" + + + *: "Vel eit anna spel" + + + + id: LANG_CHESSBOX_LEVEL_1 + desc: in the chessbox game level selection + user: core + + *: "Level 1: 60 moves / 5 min" + + + *: "Nivå 1: 60 trekk / 5 min" + + + *: "Nivå 1, 60 trekk på 5 minutt" + + + + id: LANG_CHESSBOX_LEVEL_2 + desc: in the chessbox game level selection + user: core + + *: "Level 2: 60 moves / 15 min" + + + *: "Nivå 2: 60 trekk / 15 min" + + + *: "Nivå 2, 60 trekk på 15 minutt" + + + + id: LANG_CHESSBOX_LEVEL_3 + desc: in the chessbox game level selection + user: core + + *: "Level 3: 60 moves / 30 min" + + + *: "Nivå 3: 60 trekk / 30 min" + + + *: "Nivå 3, 60 trekk på 30 minutt" + + + + id: LANG_CHESSBOX_LEVEL_4 + desc: in the chessbox game level selection + user: core + + *: "Level 4: 40 moves / 30 min" + + + *: "Level 4: 40 moves / 30 min" + + + *: "Level 4, 40 moves per 30 minutes" + + + + id: LANG_CHESSBOX_LEVEL_5 + desc: in the chessbox game level selection + user: core + + *: "Level 5: 40 moves / 60 min" + + + *: "Nivå 5: 40 trekk / 60 min" + + + *: "Nivå 5, 40 trekk på 60 minutt" + + + + id: LANG_CHESSBOX_LEVEL_6 + desc: in the chessbox game level selection + user: core + + *: "Level 6: 40 moves / 120 min" + + + *: "Nivå 6: 40 trekk / 120 min" + + + *: "Nivå 6, 40 trekk på 120 minutt" + + + + id: LANG_CHESSBOX_LEVEL_7 + desc: in the chessbox game level selection + user: core + + *: "Level 7: 40 moves / 240 min" + + + *: "Nivå 7: 40 trekk / 240 min" + + + *: "Nivå 7, 40 trekk på 240 minutt" + + + + id: LANG_CHESSBOX_PGN_PARSE_ERROR + desc: in the chessbox game viewer + user: core + + *: "Error parsing game !" + + + *: "Greidde ikkje lesa spelet!" + + + *: "Greidde ikkje lesa spelet!" + + + + id: LANG_CHESSBOX_NO_GAMES + desc: in the chessbox game viewer + user: core + + *: "No games found !" + + + *: "Fann ingen spel!" + + + *: "Fann ingen spel!" + + + + id: LANG_CHESSBOX_GAME_BEGINNING + desc: in the chessbox game viewer + user: core + + *: "At the beginning of the game" + + + *: "På starten av spelet" + + + *: "På starten av spelet" + + + + id: LANG_CHESSBOX_GAME_END + desc: in the chessbox game viewer + user: core + + *: "At the end of the game" + + + *: "På slutten av spelet" + + + *: "På slutten av spelet" + + + + id: VOICE_PLAYER + desc: spoken only, for announcing player's id + user: core + + *: "" + + + *: "" + + + *: "Spelar" + + + + id: VOICE_GNUCHESS + desc: spoken only, for announcing player's id + user: core + + *: "" + + + *: "" + + + *: "GNU sjakk" + + + + id: VOICE_MARKED + desc: spoken only, for announcing chess piece marking + user: core + + *: "" + + + *: "" + + + *: "Markert" + + + + id: VOICE_UNMARKED + desc: spoken only, for announcing chess piece unmarking + user: core + + *: "" + + + *: "" + + + *: "Umarkert" + + + + id: VOICE_WHITE + desc: spoken only, for announcing chess piece color + user: core + + *: "" + + + *: "" + + + *: "Kvit" + + + + id: VOICE_BLACK + desc: spoken only, for announcing chess piece color + user: core + + *: "" + + + *: "" + + + *: "Svart" + + + + id: VOICE_CHESSBOX_CHECK + desc: spoken only, for announcing chess moves + user: core + + *: "" + + + *: "" + + + *: "Sjakk!" + + + + id: VOICE_CHESSBOX_CAPTURES + desc: spoken only, for announcing chess moves + user: core + + *: "" + + + *: "" + + + *: "fanga" + + + + id: VOICE_CHESSBOX_CASTLE + desc: spoken only, for announcing chess moves + user: core + + *: "" + + + *: "" + + + *: "slott" + + + + id: VOICE_CHESSBOX_KINGSIDE + desc: spoken only, for announcing chess moves + user: core + + *: "" + + + *: "" + + + *: "kongesida" + + + + id: VOICE_CHESSBOX_QUEENSIDE + desc: spoken only, for announcing chess moves + user: core + + *: "" + + + *: "" + + + *: "dronningsida" + + + + id: VOICE_PAWN + desc: spoken only, for announcing chess piece names + user: core + + *: "" + + + *: "" + + + *: "Bonde" + + + + id: VOICE_KNIGHT + desc: spoken only, for announcing chess piece names + user: core + + *: "" + + + *: "" + + + *: "Hest" + + + + id: VOICE_BISHOP + desc: spoken only, for announcing chess piece names + user: core + + *: "" + + + *: "" + + + *: "Løpar" + + + + id: VOICE_ROOK + desc: spoken only, for announcing chess piece names + user: core + + *: "" + + + *: "" + + + *: "Tårn" + + + + id: VOICE_QUEEN + desc: spoken only, for announcing chess piece names + user: core + + *: "" + + + *: "" + + + *: "Dronning" + + + + id: VOICE_KING + desc: spoken only, for announcing chess piece names + user: core + + *: "" + + + *: "" + + + *: "Konge" + + + + id: LANG_CHESSBOX_GAMES + desc: in chessbox + user: core + + *: "Games" + + + *: "Spel" + + + *: "" + + + + id: LANG_CHESSBOX_SAVING_POSITION + desc: in chessbox + user: core + + *: "Saving position" + + + *: "Lagrar posisjon" + + + *: "Lagrar posisjon" + + + + id: LANG_CHESSBOX_LOADING_POSITION + desc: in chessbox + user: core + + *: "Loading position" + + + *: "Lastar posisjon" + + + *: "Lastar posisjon" + + + + id: LANG_CHESSBOX_THINKING + desc: in chessbox + user: core + + *: "Thinking..." + + + *: "Tenkjer..." + + + *: "Tenkjer" + + + + id: VOICE_BATTERY_BENCH_IS_ALREADY_RUNNING + desc: Spoken if battery bench is already running + user: core + + *: "" + + + *: "" + + + *: "Batterimålinga køyrer allereie" + + + + id: VOICE_BAT_BENCH_KEYS + desc: Battery bench start up message + user: core + + *: "" + + + *: "" + + + *: "Press spel for å køyra batterimåling eller stopp for å avbryta" + + + + id: LANG_CANNOT_RESTART_PLAYBACK + desc: cannot restart playback splash in imageviewer + user: core + + *: "Cannot restart playback" + + + *: "Kan ikkje starta speling på nytt" + + + *: "Kan ikkje starta speling på nytt" + + + + id: LANG_ORDERED + desc: in the imageviewer settings menu + user: core + + *: "Ordered" + + + *: "Ordna" + + + *: "Ordna" + + + + id: LANG_DIFFUSION + desc: in the imageviewer settings menu + user: core + + *: "Diffusion" + + + *: "Uklårleik" + + + *: "Uklårleik" + + + + id: LANG_GRAYSCALE + desc: in the imageviewer settings menu + user: core + + *: "Grayscale" + + + *: "Gråtonar" + + + *: "Gråtonar" + + + + id: LANG_SLIDESHOW_MODE + desc: in the imageviewer settings menu + user: core + + *: "Toggle Slideshow Mode" + + + *: "Skru på lysbiletemodus" + + + *: "Skru på lysbiletemodus" + + + + id: LANG_SLIDESHOW_TIME + desc: in the imageviewer settings menu + user: core + + *: "Slideshow Time" + + + *: "Framsyningstid" + + + *: "Framsyningstid" + + + + id: LANG_RETURN + desc: in various plugin menus + user: core + + *: "Return" + + + *: "Tilbake" + + + *: "Tilbake" + + + + id: LANG_REC_DIR + desc: used in the info screen to show a recording dir + user: core + + *: none + recording: "Recording Directory" + + + *: none + recording: "Opptaksmappe" + + + *: none + recording: "Opptaksmappe" + + + + id: LANG_CHESSBOX_MENU_VIEW_GAMES + desc: in the chessbox menu + user: core + + *: "View Played Games" + + + *: "Sjå spela du har spelt" + + + *: "Sjå spela du har spelt" + + + + id: LANG_MENU_AUDIO_OPTIONS + desc: in mpegplayer menus + user: core + + *: "Audio Options" + lowmem: none + + + *: "Lydinnstillingar" + lowmem: none + + + *: "Lydinnstillingar" + lowmem: none + + + + id: LANG_MENU_RESUME_OPTIONS + desc: in mpegplayer menus + user: core + + *: "Resume Options" + lowmem: none + + + *: "Innstillingar for vidarespeling" + lowmem: none + + + *: "Innstillingar for vidarespeling" + lowmem: none + + + + id: LANG_MENU_PLAY_MODE + desc: in mpegplayer menus + user: core + + *: "Play Mode" + lowmem: none + + + *: "Spelemodus" + lowmem: none + + + *: "Spelemodus" + lowmem: none + + + + id: LANG_SINGLE + desc: in mpegplayer menus + user: core + + *: "Single" + lowmem: none + + + *: "Berre ein" + lowmem: none + + + *: "Berre ein" + lowmem: none + + + + id: LANG_USE_SOUND_SETTING + desc: in mpegplayer menus + user: core + + *: "Use sound setting" + lowmem: none + + + *: "Bruk lydinnstilling" + lowmem: none + + + *: "Bruk lydinnstilling" + lowmem: none + + + + id: LANG_RESTART_PLAYBACK + desc: in the mpegplayer settings menu + user: core + + *: "Play from beginning" + lowmem: none + + + *: "Spel frå starten" + lowmem: none + + + *: "Spel frå starten" + lowmem: none + + + + id: LANG_SET_RESUME_TIME + desc: in the mpegplayer settings menu + user: core + + *: "Set resume time (min)" + lowmem: none + + + *: "Set vidarespelingstid (min)" + lowmem: none + + + *: "Set vidarespelingstid" + lowmem: none + + + + id: LANG_DISPLAY_FPS + desc: in the mpegplayer and pictureflow settings menus + user: core + + *: "Display FPS" + + + *: "Vis rammer per sekund" + + + *: "Vis rammer per sekund" + + + + id: LANG_LIMIT_FPS + desc: in the mpegplayer settings menu + user: core + + *: "Limit FPS" + lowmem: none + + + *: "Avgrens rammer per sekund" + lowmem: none + + + *: "Avgrens rammer per sekund" + lowmem: none + + + + id: LANG_SKIP_FRAMES + desc: in the mpegplayer settings menu + user: core + + *: "Skip frames" + lowmem: none + + + *: "Hopp over rammer" + lowmem: none + + + *: "Hopp over rammer" + lowmem: none + + + + id: LANG_BACKLIGHT_BRIGHTNESS + desc: in the mpegplayer settings menu + user: core + + *: "Backlight brightness" + lowmem: none + + + *: "Skjermlysstyrke" + lowmem: none + + + *: "Skjermlysstyrke" + lowmem: none + + + + id: LANG_USE_COMMON_SETTING + desc: in the mpegplayer settings menu + user: core + + *: "Use common setting" + lowmem: none + + + *: "Bruk vanleg innstilling" + lowmem: none + + + *: "Bruk vanleg innstilling" + lowmem: none + + + + id: LANG_TONE_CONTROLS + desc: in the mpegplayer settings menu + user: core + + *: "Tone controls" + lowmem: none + + + *: "Tonekontrollar" + lowmem: none + + + *: "Tonekontrollar" + lowmem: none + + + + id: LANG_FORCE_START_MENU + desc: in mpegplayer menus + user: core + + *: "Start menu" + lowmem: none + + + *: "Startmeny" + lowmem: none + + + *: "Startmeny" + lowmem: none + + + + id: LANG_CONDITIONAL_START_MENU + desc: in mpegplayer menus + user: core + + *: "Start menu if not completed" + lowmem: none + + + *: "Startmeny viss ikkje fullført" + lowmem: none + + + *: "Startmeny viss ikkje fullført" + lowmem: none + + + + id: LANG_AUTO_RESUME + desc: in mpegplayer menus + user: core + + *: "Resume automatically" + lowmem: none + + + *: "Spel vidare automatisk" + lowmem: none + + + *: "Spel vidare automatisk" + lowmem: none + + + + id: LANG_CLEAR_ALL_RESUMES + desc: in the mpegplayer settings menu + user: core + + *: "Clear all resumes" + lowmem: none + + + *: "Tøm alle vidarespelingar" + lowmem: none + + + *: "Tøm alle vidarespelingar" + lowmem: none + + + + id: LANG_UNAVAILABLE + desc: in mpegplayer settings + user: core + + *: "Unavailable" + lowmem: none + + + *: "Utilgjengeleg" + lowmem: none + + + *: "Utilgjengeleg" + lowmem: none + + + + id: LANG_TOGGLE_ITEM + desc: deprecated + user: core + + *: "" + + + *: "" + + + *: "" + + + + id: LANG_MOVE_ITEM_UP + desc: in main_menu_config + user: core + + *: "Move Item Up" + + + *: "Flytt opp" + + + *: "Flytt opp" + + + + id: LANG_MOVE_ITEM_DOWN + desc: in main_menu_config + user: core + + *: "Move Item Down" + + + *: "Flytt ned" + + + *: "Flytt ned" + + + + id: LANG_LOAD_DEFAULT_CONFIGURATION + desc: in main_menu_config + user: core + + *: "Load Default Configuration" + + + *: "Last standardval" + + + *: "Last standardval" + + + + id: LANG_SAVE_EXIT + desc: in main_menu_config + user: core + + *: "Save and Exit" + + + *: "Lagre og avslutt" + + + *: "Lagre og avslutt" + + + + id: LANG_MAIN_MENU_ORDER + desc: deprecated + user: core + + *: "" + + + *: "" + + + *: "" + + + + id: LANG_PROPERTIES_PATH + desc: in properties plugin + user: core + + *: "[Path]" + + + *: "[Sti]" + + + *: "Sti" + + + + id: LANG_PROPERTIES_FILENAME + desc: in properties plugin + user: core + + *: "[Filename]" + + + *: "[Filnamn]" + + + *: "Filnamn" + + + + id: LANG_PROPERTIES_SIZE + desc: in properties plugin + user: core + + *: "[Size]" + + + *: "[Storleik]" + + + *: "Storleik" + + + + id: LANG_PROPERTIES_DATE + desc: in properties plugin + user: core + + *: "[Date]" + + + *: "[Dato]" + + + *: "Dato" + + + + id: LANG_PROPERTIES_TIME + desc: in properties plugin + user: core + + *: "[Time]" + + + *: "[Tid]" + + + *: "Tid" + + + + id: LANG_PROPERTIES_SUBDIRS + desc: in properties plugin + user: core + + *: "[Subdirs]" + + + *: "[Undermapper]" + + + *: "Undermapper" + + + + id: LANG_PROPERTIES_FILES + desc: in properties plugin + user: core + + *: "[Files]" + + + *: "[Filer]" + + + *: "Filer" + + + + id: LANG_PROPERTIES_DIRECTORY_PROPERTIES + desc: in properties plugin + user: core + + *: "Directory properties" + + + *: "Mappeeigenskapar" + + + *: "" + + + + id: LANG_PROPERTIES_FILE_PROPERTIES + desc: in properties plugin + user: core + + *: "File properties" + + + *: "Fileigenskapar" + + + *: "" + + + + id: LANG_PROPERTIES_FAIL + desc: in properties plugin + user: core + + *: "Failed to gather information" + + + *: "Greidde ikkje samla informasjon" + + + *: "Greidde ikkje samla informasjon" + + + + id: LANG_SWAP_CHANNELS + desc: in sound_settings + user: core + + *: "Swap Channels" + + + *: "Byt kanalar" + + + *: "Byt kanalar" + + + + id: LANG_PANNING_SEPARATION + desc: in mikmod settings menu + user: core + + *: "Panning Separation" + lowmem: none + + + *: "Panoreringsskilnad" + lowmem: none + + + *: "Panoreringsskilnad" + lowmem: none + + + + id: LANG_REVERBERATION + desc: in mikmod settings menu + user: core + + *: "Reverberation" + lowmem: none + + + *: "Klang" + lowmem: none + + + *: "Klang" + lowmem: none + + + + id: LANG_INTERPOLATION + desc: in mikmod settings menu + user: core + + *: "Interpolation" + lowmem: none + + + *: "Interpolering" + lowmem: none + + + *: "Interpolering" + lowmem: none + + + + id: LANG_MIKMOD_SURROUND + desc: in mikmod settings menu + user: core + + *: "Surround" + lowmem: none + + + *: "Kringlyd" + lowmem: none + + + *: "Kringlyd" + lowmem: none + + + + id: LANG_MIKMOD_HQMIXER + desc: in mikmod settings menu + user: core + + *: "HQ Mixer" + lowmem: none + + + *: "HQ-miksar" + lowmem: none + + + *: "Høgkvalitetsmiksar" + lowmem: none + + + + id: LANG_MIKMOD_SAMPLERATE + desc: in mikmod settings menu + user: core + + *: "Sample Rate" + lowmem: none + + + *: "Punktrate" + lowmem: none + + + *: "Punktrate" + lowmem: none + + + + id: LANG_CPU_BOOST + desc: in mikmod settings menu + user: core + + *: "CPU Boost" + lowmem: none + + + *: "Prosessorboost" + lowmem: none + + + *: "Prosessorboost" + lowmem: none + + + + id: LANG_SPACING + desc: in the pictureflow settings menu + user: core + + *: "Spacing" + + + *: "Mellomrom" + + + *: "Mellomrom" + + + + id: LANG_CENTRE_MARGIN + desc: in the pictureflow settings menu + user: core + + *: "Centre margin" + + + *: "Midtmarg" + + + *: "Midtmarg" + + + + id: LANG_NUMBER_OF_SLIDES + desc: in the pictureflow settings menu + user: core + + *: "Number of slides" + + + *: "Tal på lysbilete" + + + *: "Tal på lysbilete" + + + + id: LANG_ZOOM + desc: in the pictureflow settings menu + user: core + + *: "Zoom" + + + *: "Zoom" + + + *: "Zoom" + + + + id: LANG_SHOW_ALBUM_TITLE + desc: in the pictureflow settings menu + user: core + + *: "Show album title" + + + *: "Vis albumtittel" + + + *: "Vis albumtittel" + + + + id: LANG_RESIZE_COVERS + desc: in the pictureflow settings menu + user: core + + *: "Resize Covers" + + + *: "Skaler omslag" + + + *: "Skaler omslag" + + + + id: LANG_REBUILD_CACHE + desc: in the pictureflow settings menu + user: core + + *: "Rebuild cache" + + + *: "Lag nytt mellomlager" + + + *: "Lag nytt mellomlager" + + + + id: LANG_WPS_INTEGRATION + desc: in the pictureflow settings menu + user: core + + *: "WPS Integration" + + + *: "Speleskjermintegrering" + + + *: "Speleskjermintegrering" + + + + id: LANG_GOTO_WPS + desc: in the pictureflow main menu + user: core + + *: "Go to WPS" + + + *: "Gå til speleskjermen" + + + *: "Gå til speleskjermen" + + + + id: LANG_HIDE_ALBUM_TITLE + desc: in the pictureflow settings + user: core + + *: "Hide album title" + + + *: "Gøym albumtittel" + + + *: "Gøym albumtittel" + + + + id: LANG_SHOW_AT_THE_BOTTOM + desc: in the pictureflow settings + user: core + + *: "Show at the bottom" + + + *: "Vis på botnen" + + + *: "Vis på botnen" + + + + id: LANG_SHOW_AT_THE_TOP + desc: in the pictureflow settings + user: core + + *: "Show at the top" + + + *: "Vis på toppen" + + + *: "Vis på toppen" + + + + id: LANG_DIRECT + desc: in the pictureflow settings, also a volume adjustment mode + user: core + + *: "Direct" + + + *: "Direkte" + + + *: "Direkte" + + + + id: LANG_VIA_TRACK_LIST + desc: in the pictureflow settings + user: core + + *: "Via Track list" + + + *: "Via sporliste" + + + *: "Via sporliste" + + + + id: LANG_ALWAYS_ON + desc: in the pictureflow settings menu + user: core + + *: "Always On" + + + *: "Alltid på" + + + *: "Alltid på" + + + + id: LANG_NO_ALBUMART_FOUND + desc: in the pictureflow splash messages + user: core + + *: "No album art found" + + + *: "Fann ingen omslag" + + + *: "Fann ingen omslag" + + + + id: LANG_ERROR_WRITING_CONFIG + desc: in the pictureflow splash messages + user: core + + *: "Error writing config" + + + *: "Greidde ikkje skriva oppsett" + + + *: "Greidde ikkje skriva oppsett" + + + + id: LANG_NOT_A_VBR_FILE + desc: in vbrfix plugin + user: core + + *: "Not a VBR file" + + + *: "Ikkje ei VBR-fil" + + + *: "Ikkje ei V B R fil" + + + + id: LANG_FILE_ERROR + desc: in vbrfix plugin + user: core + + *: "File error: %d" + + + *: "Filfeil: %d" + + + *: "Filfeil" + + + + id: LANG_UPDATE_CACHE + desc: in pictureflow + user: core + + *: "Update cache" + + + *: "Oppdater mellomlager" + + + *: "Oppdater mellomlager" + + + + id: LANG_HIDE_ALBUM_TITLE_NEW + desc: in the pictureflow settings + user: core + + *: "Hide information" + + + *: "Gøym informasjon" + + + *: "Gøym informasjon" + + + + id: LANG_SHOW_AT_THE_BOTTOM_NEW + desc: in the pictureflow settings + user: core + + *: "Show album at the bottom" + + + *: "Vis albumet på botnen" + + + *: "Vis albumet på botnen" + + + + id: LANG_SHOW_AT_THE_TOP_NEW + desc: in the pictureflow settings + user: core + + *: "Show album at the top" + + + *: "Vis albumet på toppen" + + + *: "Vis albumet på toppen" + + + + id: LANG_SHOW_ALL_AT_THE_TOP + desc: in the pictureflow settings + user: core + + *: "Show album and artist at the top" + + + *: "Vis albumet og artisten på toppen" + + + *: "Vis albumet og artisten på toppen" + + + + id: LANG_SHOW_ALL_AT_THE_BOTTOM + desc: in the pictureflow settings + user: core + + *: "Show album and artist at the bottom" + + + *: "Vis albumet og artisten på botnen" + + + *: "Vis albumet og artisten på botnen" + + + + id: LANG_ACTION_STD_CANCEL + desc: standard press x to cancel string + user: core + + *: "Press LEFT to cancel." + android,hifietma*: "Press BACK to cancel." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." + ihifi760,ihifi960: "Double tap RETURN to cancel." + ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." + iriverh10,samsungyh*: "Double tap LEFT to cancel." + mpiohd200: "Double tap REC to cancel." + mpiohd300: "Double tap MENU to cancel." + rx27generic: "Press VOLUME to cancel." + sonynwza860: "Keymaps incomplete." + touchscreen: "Press Middle Left to cancel." + vibe500: "Press PREV to cancel." + xduoox20,xduoox3,xduoox3ii: "Double tap HOME to cancel." + + + *: "Trykk VENSTRE for å avbryta." + android,hifietma*: "Trykk TILBAKE for å avbryta." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Trykk PÅ for å avbryta." + ihifi760,ihifi960: "Dobbeltrykk TILBAKE for å avbryta." + ihifi770,ihifi770c,ihifi800: "Trykk HEIM for å avbryta." + iriverh10,samsungyh*: "Dobbeltrykk VENSTRE for å avbryta." + mpiohd200: "Dobbeltrykk REC for å avbryta." + mpiohd300: "Dobbeltrykk MENY for å avbryta." + rx27generic: "Trykk VOLUM for å avbryta." + sonynwza860: "Ufullstendige teiknkart." + touchscreen: "Trykk midt venstre for å avbryta." + vibe500: "Trykk FØRRE for å avbryta." + xduoox20,xduoox3,xduoox3ii: "Dobbeltrykk HEIM for å avbryta." + + + *: "Trykk VENSTRE for å avbryta." + android,hifietma*: "Trykk TILBAKE for å avbryta." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Trykk PÅ for å avbryta." + ihifi760,ihifi960: "Dobbeltrykk TILBAKE for å avbryta." + ihifi770,ihifi770c,ihifi800: "Trykk HEIM for å avbryta." + iriverh10,samsungyh*: "Dobbeltrykk VENSTRE for å avbryta." + mpiohd200: "Dobbeltrykk REC for å avbryta." + mpiohd300: "Dobbeltrykk MENY for å avbryta." + rx27generic: "Trykk VOLUM for å avbryta." + touchscreen: "Trykk midt venstre for å avbryta." + vibe500: "Trykk FØRRE for å avbryta." + xduoox20,xduoox3,xduoox3ii: "Dobbeltrykk HEIM for å avbryta." + + + + id: LANG_DATE + desc: for constructing time and date announcements + user: core + + *: "Date" + + + *: "Dato" + + + *: "Dato" + + + + id: LANG_CLEAR_ALL + desc: + user: core + + *: "Clear all" + + + *: "Tøm alle" + + + *: "Tøm alle" + + + + id: LANG_CANCEL_0 + desc: CANCEL. + user: core + + *: "Cancel" + + + *: "Avbryt" + + + *: "Avbryt" + + + + id: LANG_SAVE + desc: + user: core + + *: "Save" + + + *: "Lagra" + + + *: "Lagra" + + + + id: LANG_TIMEOUT + desc: + user: core + + *: "Timeout" + + + *: "Tidsavbrot" + + + *: "Tidsavbrot" + + + + id: LANG_TRACK + desc: used in track x of y constructs + user: core + + *: "Track" + + + *: "Spor" + + + *: "Spor" + + + + id: LANG_ELAPSED + desc: prefix for elapsed playtime announcement + user: core + + *: "Elapsed" + + + *: "Gått" + + + *: "Gått" + + + + id: LANG_ANNOUNCEMENT_FMT + desc: format for wps hotkey announcement + user: core + + *: none + hotkey: "Announcement format" + + + *: none + hotkey: "Meldingsformat" + + + *: none + hotkey: "Meldingsformat" + + + + id: LANG_ANNOUNCE_STATUS + desc: announnnce_status plugin + user: core + + *: "Announce Status" + + + *: "Meldingsstatus" + + + *: "Meldingsstatus" + + + + id: LANG_REMAIN + desc: for constructs such as number of tracks remaining etc + user: core + + *: none + hotkey: "Remain" + + + *: none + hotkey: "Står att" + + + *: none + hotkey: "Står att" + + + + id: LANG_GROUPING + desc: + user: core + + *: none + hotkey: "Grouping" + + + *: none + hotkey: "Gruppering" + + + *: none + hotkey: "Gruppering" + + + + id: LANG_ANNOUNCE_ON + desc: + user: core + + *: none + hotkey: "Announce on" + + + *: none + hotkey: "Meld frå ved" + + + *: none + hotkey: "Meld frå ved" + + + + id: LANG_TRACK_CHANGE + desc: + user: core + + *: none + hotkey: "Track change" + + + *: none + hotkey: "Nytt spor" + + + *: none + hotkey: "Nytt spor" + + + + id: LANG_HOLD_FOR_SETTINGS + desc: + user: core + + *: none + hotkey: "Hold for settings" + + + *: none + hotkey: "Hald for innstillingar" + + + *: none + hotkey: "Hald for innstillingar" + + + + id: LANG_OPEN_PLUGIN + desc: onplay open plugin + user: core + + *: "Open Plugin" + + + *: "Opna tillegg" + + + *: "Opna tillegg" + + + + id: LANG_OPEN_PLUGIN_NOT_A_PLUGIN + desc: open plugin module + user: core + + *: "Not a plugin: %s" + + + *: "Ikkje eit tillegg: %s" + + + *: "Ikkje eit tillegg" + + + + id: LANG_OPEN_PLUGIN_SET_WPS_CONTEXT_PLUGIN + desc: open plugin module + user: core + + *: "Set WPS Context Plugin" + + + *: "Vel konteksttillegg for speleskjerm" + + + *: "Vel konteksttillegg for speleskjerm" + + + + id: LANG_PARAMETER + desc: + user: core + + *: "Parameter" + + + *: "~Parameter" + + + *: "~Parameter" + + + + id: LANG_NAME + desc: + user: core + + *: "Name" + + + *: "Namn" + + + *: "Namn" + + + + id: LANG_ADD + desc: + user: core + + *: "Add" + + + *: "Legg til" + + + *: "Legg til" + + + + id: LANG_BACK + desc: + user: core + + *: "Back" + + + *: "Tilbake" + + + *: "Tilbake" + + + + id: LANG_EDIT + desc: + user: core + + *: "Edit" + + + *: "Rediger" + + + *: "Rediger" + + + + id: LANG_RUN + desc: + user: core + + *: "Run" + + + *: "Spring" + + + *: "Spring" + + + + id: LANG_EXPORT + desc: + user: core + + *: "Export" + + + *: "Eksporter" + + + *: "Eksporter" + + + + id: LANG_BROWSE + desc: + user: core + + *: "Browse" + + + *: "Sjå gjennom" + + + *: "Sjå gjennom" + + + + id: LANG_ENTER_USB_STORAGE_MODE_QUERY + desc: upon plugging in USB + user: core + + *: "Enter USB mass storage mode?" + + + *: "Start USB-masselagringsmodus?" + + + *: "Start U S B masselagringsmodus?" + + + + id: LANG_QUEUE_MENU + desc: in onplay menu + user: core + + *: "Queue..." + + + *: "Kø..." + + + *: "Kø" + + + + id: LANG_SHOW_QUEUE_OPTIONS + desc: in Current Playlist settings + user: core + + *: "Show Queue Options" + + + *: "Vis val for køar" + + + *: "Vis val for køar" + + + + id: LANG_SHOW_SHUFFLED_ADDING_OPTIONS + desc: in Current Playlist settings + user: core + + *: "Show Shuffled Adding Options" + + + *: "Vis val for å leggja til tilfeldig" + + + *: "Vis val for å leggja til tilfeldig" + + + + id: LANG_IN_SUBMENU + desc: in Settings + user: core + + *: "In Submenu" + + + *: "I undermeny" + + + *: "I undermeny" + + + + id: LANG_SOFTLOCK_DISABLE_ALL_NOTIFY + desc: disable all softlock notifications + user: core + + *: "Disable All Lock Notifications" + + + *: "Skru av alle låsevarslingar" + + + *: "Skru av alle låsevarslingar" + + + + id: LANG_ACTION_VOLUME + desc: exempt volume from softlock + user: core + + *: "Exempt Volume" + + + *: "Unnateke volum" + + + *: "Unnateke volum" + + + + id: LANG_ACTION_ALWAYSAUTOLOCK + desc: always prime autolock + user: core + + *: "Always Autolock" + + + *: "Alltid autolås" + + + *: "Alltid autolås" + + + + id: VOICE_NUMERIC_TENS_SWAP_SEPARATOR + desc: voice only, for speaking numbers in languages that swap the tens and ones fields. Leave blank for languages that do not need it, such as English ("231" => "two hundred thirty one") but other languages may speak it as "two hundred one [AND] thirty" + user: core + + *: "" + + + *: "" + + + *: "" + + + + id: LANG_VOICED_DATE_FORMAT + desc: format string for how dates will be read back. Y == 4-digit year (grouped), y == 4-digit year (numeric), A == month name, m == numeric month, d == numeric day. For example, for 2021-01-05, "AdY" will be voiced as "January 5 twenty twenty-one" and "dmy" will be voiced as "5 1 two thousand twenty one + user: core + + *: "dAY" + + + *: "dAY" + + + *: "" + + + + id: LANG_LIST_WRAPAROUND + desc: in Settings + user: core + + *: "List Wraparound" + + + *: "Lista tilbake frå toppen" + + + *: "Lista tilbake frå toppen" + + + + id: LANG_SHOW_SHUTDOWN_MESSAGE + desc: in Settings + user: core + + *: "Show Shutdown Message" + + + *: "Vis avsluttingsmelding" + + + *: "Vis avsluttingsmelding" + + + + id: LANG_LIST_ORDER + desc: in Settings + user: core + + *: "List Order" + + + *: "Sortering" + + + *: "Sortering" + + + + id: LANG_ASCENDING + desc: in Settings + user: core + + *: "Ascending" + + + *: "Stigande" + + + *: "Stigande" + + + + id: LANG_DESCENDING + desc: in Settings + user: core + + *: "Descending" + + + *: "Søkkande" + + + *: "Søkkande" + + + + id: LANG_ALBUM_ART + desc: in Settings + user: core + + *: "Album Art" + + + *: "Omslag" + + + *: "Omslag" + + + + id: LANG_PREFER_EMBEDDED + desc: in Settings + user: core + + *: "Prefer Embedded" + + + *: "Bruk innebygde" + + + *: "Bruk innebygde" + + + + id: LANG_PREFER_IMAGE_FILE + desc: in Settings + user: core + + *: "Prefer Image File" + + + *: "Bruk biletfil" + + + *: "Bruk biletfil" + + + + id: LANG_FM_SYNC_RDS_TIME + desc: in radio screen and Settings + user: core + + *: none + rds: "Sync RDS Time" + + + *: none + rds: "Synkroniser RDS-tid" + + + *: none + rds: "Synkroniser RDS-tid" + + + + id: LANG_SORT_ALBUMS_BY + desc: in Settings + user: core + + *: "Sort albums by" + + + *: "Sorter album etter" + + + *: "Sorter album etter" + + + + id: LANG_ARTIST_PLUS_NAME + desc: in Settings + user: core + + *: "Artist + Name" + + + *: "Artist + Namn" + + + *: "Artist og namn" + + + + id: LANG_ARTIST_PLUS_YEAR + desc: in Settings + user: core + + *: "Artist + Year" + + + *: "Artist + år" + + + *: "Artist og år" + + + + id: LANG_YEAR_SORT_ORDER + desc: in Settings + user: core + + *: "Year sort order" + + + *: "Sortering for år" + + + *: "Sortering for år" + + + + id: LANG_SHOW_YEAR_IN_ALBUM_TITLE + desc: in Settings + user: core + + *: "Show year in album title" + + + *: "Vis år i albumtittelen" + + + *: "Vis år i albumtittelen" + + + + id: LANG_WAIT_FOR_CACHE + desc: in Settings + user: core + + *: "Cache needs to finish updating first!" + + + *: "Mellomlageret må oppdaterast fyrst!" + + + *: "Mellomlageret må oppdaterast fyrst!" + + + + id: LANG_TRACK_INFO + desc: Track Info Title + user: core + + *: "Track Info" + + + *: "Sporinfo" + + + *: "Sporinfo" + + + + id: LANG_PLAY + desc: play selected file/directory, in playlist context menu + user: core + + *: "Play" + + + *: "Spel" + + + *: "Spel" + + + + id: LANG_PLAY_SHUFFLED + desc: play selected files in shuffled order, in playlist context menu + user: core + + *: "Play Shuffled" + + + *: "Spel tilfeldig" + + + *: "Spel tilfeldig" + + + + id: LANG_KEEP_CURRENT_TRACK_ON_REPLACE + desc: used in the playlist settings menu + user: core + + *: "Keep Current Track When Replacing Playlist" + + + *: "Hald på dette sporet når du byter ut spelelista" + + + *: "Hald på dette sporet når du byter ut spelelista" + + + + id: LANG_CLEAR_SETTINGS_ON_HOLD + desc: in the system sub menu + user: core + + *: none + clear_settings_on_hold,iriverh10: "Clear settings when reset button is held during startup" + ipod4g,ipodcolor,ipodmini1g,ipodmini2g,ipodnano1g,ipodvideo: "Clear settings when hold switch is on during startup" + + + *: none + clear_settings_on_hold,iriverh10: "Tøm innstillingar når du held inne nullstill-knappen ved oppstart" + ipod4g,ipodcolor,ipodmini1g,ipodmini2g,ipodnano1g,ipodvideo: "Tøm innstillingar når du held inne hald-knappen ved oppstart" + + + *: none + clear_settings_on_hold,iriverh10: "Tøm innstillingar når du held inne nullstill-knappen ved oppstart" + ipod4g,ipodcolor,ipodmini1g,ipodmini2g,ipodnano1g,ipodvideo: "Tøm innstillingar når du held inne hald-knappen ved oppstart" + + + + id: LANG_REWIND_ACROSS_TRACKS + desc: in playback settings menu + user: core + + *: "Rewind Across Tracks" + + + *: "Spol tilbake fleire spor" + + + *: "Spol tilbake fleire spor" + + + + id: LANG_SET_AS + desc: used in the onplay menu + user: core + + *: "Set As..." + + + *: "Bruk som..." + + + *: "Bruk som" + + + + id: LANG_PLAYLIST_DIR + desc: used in the onplay menu + user: core + + *: "Playlist Directory" + + + *: "Spelelistemappe" + + + *: "Spelelistemappe" + + + + id: LANG_START_DIR + desc: used in the onplay menu + user: core + + *: "Start Directory" + + + *: "Startmappe" + + + *: "Startmappe" + + + + id: LANG_RECORDING_DIR + desc: used in the onplay menu + user: core + + *: none + recording: "Recording Directory" + + + *: none + recording: "Opptaksmappe" + + + *: none + recording: "Opptaksmappe" + + + + id: LANG_ADD_TO_PL + desc: used in the onplay menu + user: core + + *: "Add to Playlist..." + + + *: "Legg til speleliste..." + + + *: "Legg til speleliste" + + + + id: LANG_ADD_TO_EXISTING_PL + desc: used in the onplay menu + user: core + + *: "Add to Existing Playlist" + + + *: "Legg til denne spelelista" + + + *: "Legg til denne spelelista" + + + + id: LANG_PLAYING_NEXT + desc: used in the onplay menu + user: core + + *: "Playing Next..." + + + *: "Spelar neste..." + + + *: "Spelar neste" + + + + id: LANG_PLAY_NEXT + desc: used in the onplay menu + user: core + + *: "Play Next" + + + *: "Spel neste" + + + *: "Spel neste" + + + + id: LANG_ADD_SHUFFLED + desc: used in the onplay menu + user: core + + *: "Add Shuffled" + + + *: "Legg til tilfeldig" + + + *: "Legg til tilfeldig" + + + + id: LANG_PLAY_LAST + desc: used in the onplay menu + user: core + + *: "Play Last" + + + *: "Spel siste" + + + *: "Spel siste" + + + + id: LANG_PLAY_LAST_SHUFFLED + desc: used in the onplay menu + user: core + + *: "Play Last Shuffled" + + + *: "Spel siste tilfeldige" + + + *: "Spel siste tilfeldige" + + + + id: LANG_VOLUME_ADJUST_MODE + desc: in system settings + user: core + + *: none + perceptual_volume: "Volume Adjustment Mode" + + + *: none + perceptual_volume: "Volumusteringsmodus" + + + *: none + perceptual_volume: "Volumjusteringsmodus" + + + + id: LANG_VOLUME_ADJUST_NORM_STEPS + desc: in system settings + user: core + + *: none + perceptual_volume: "Number of Volume Steps" + + + *: none + perceptual_volume: "Kor mange volumsteg" + + + *: none + perceptual_volume: "Kor mange volumsteg" + + + + id: LANG_PERCEPTUAL + desc: in system settings -> volume adjustment mode + user: core + + *: none + perceptual_volume: "Perceptual" + + + *: none + perceptual_volume: "Oppfatta" + + + *: none + perceptual_volume: "Oppfatta" + + + + id: LANG_SHOW_TRACKS_WHILE_BROWSING + desc: in PictureFlow Main Menu + user: core + + *: "Show Tracks While Browsing" + + + *: "Vis spor når du ser gjennom" + + + *: "Vis spor når du ser gjennom" + + + + id: LANG_GOTO_LAST_ALBUM + desc: in PictureFlow Main Menu + user: core + + *: "Go to Last Album" + + + *: "Gå til siste album" + + + *: "Gå til siste album" + + + + id: LANG_DATABASE_DIR + desc: in database settings menu + user: core + + *: "Database Directory" + + + *: "Databasemappe" + + + *: "Databasemappe" + + + + id: LANG_REMOVE_QUEUED_TRACKS + desc: Confirmation dialog + user: core + + *: "Remove Queued Tracks?" + + + *: "Fjern spor i kø?" + + + *: "Fjern spor i kø?" + + + + id: LANG_QUICK_IGNORE_DIRACHE + desc: in Settings + user: core + + *: "Quick (Ignore Directory Cache)" + + + *: "Raskt (oversjå mappemellomlager)" + + + *: "Raskt (oversjå mappemellomlager)" + + + + id: LANG_WPS + desc: in Settings + user: core + + *: "What's Playing Screen" + + + *: "Speleskjerm" + + + *: "Speleskjerm" + + + + id: LANG_DEFAULT_BROWSER + desc: in Settings + user: core + + *: "Default Browser" + + + *: "Standardlesar" + + + *: "Standardlesar" + + + + id: LANG_SET_MAZE_SIZE + desc: Maze size in Amaze game + user: core + + *: "Set Maze Size" + + + *: "Labyrintstorleik" + + + *: "Labyrintstorleik" + + + + id: LANG_VIEW_MAP + desc: Map in Amaze game + user: core + + *: "View Map" + + + *: "Sjå kartet" + + + *: "Sjå kartet" + + + + id: LANG_SHOW_COMPASS + desc: Compass in Amaze game + user: core + + *: "Show Compass" + + + *: "Vis kompasset" + + + *: "Vis kompasset" + + + + id: LANG_SHOW_MAP + desc: Map in Amaze game + user: core + + *: "Show Map" + + + *: "Vis kartet" + + + *: "Vis kartet" + + + + id: LANG_REMEMBER_PATH + desc: Map in Amaze game + user: core + + *: "Remember Path" + + + *: "Hugs stien" + + + *: "Hugs stien" + + + + id: LANG_USE_LARGE_TILES + desc: Map in Amaze game + user: core + + *: "Use Large Tiles" + + + *: "Bruk store fliser" + + + *: "Bruk store fliser" + + + + id: LANG_SHOW_SOLUTION + desc: Map in Amaze game + user: core + + *: "Show Solution" + + + *: "Vis løysing" + + + *: "Vis løysing" + + + + id: LANG_QUIT_WITHOUT_SAVING + desc: + user: core + + *: "Quit without saving" + + + *: "Avslutt utan å lagra" + + + *: "Avslutt utan å lagra" + + + + id: LANG_GENERATING_MAZE + desc: Amaze game + user: core + + *: "Generating maze..." + + + *: "Lagar labyrint..." + + + *: "Lagar labyrint" + + + + id: LANG_YOU_WIN + desc: Success in game + user: core + + *: "You win!" + + + *: "Du vann!" + + + *: "Du vann!" + + + + id: LANG_YOU_CHEATED + desc: Cheated in game + user: core + + *: "You cheated!" + + + *: "Du juksa!" + + + *: "Du juksa!" + + + + id: LANG_DIFFICULTY_EASY + desc: Game difficulty + user: core + + *: "Easy" + + + *: "Lett" + + + *: "Lett" + + + + id: LANG_DIFFICULTY_MEDIUM + desc: Game difficulty + user: core + + *: "Medium" + + + *: "Middels" + + + *: "Middels" + + + + id: LANG_DIFFICULTY_HARD + desc: Game difficulty + user: core + + *: "Hard" + + + *: "Vanskeleg" + + + *: "Vanskeleg" + + + + id: LANG_DIFFICULTY_EXPERT + desc: Game difficulty + user: core + + *: "Expert" + + + *: "Ekspert" + + + *: "Ekspert" + + + + id: LANG_LEGAL_NOTICES + desc: in system menu + user: core + + *: "Legal Notices" + + + *: "Juridiske merknader" + + + *: "Juridiske merknader" + + + + id: LANG_ERROR_FORMATSTR + desc: for general use + user: core + + *: "Error: %s" + + + *: "Feil: %s" + + + *: "Feil" + + + + id: LANG_MIKMOD_SETTINGS + desc: mikmod plugin + user: core + + *: "Mikmod Settings" + + + *: "Mikmod-innstillingar" + + + *: "Mikmod-innstillingar" + + + + id: VOICE_INVALID_VOICE_FILE + desc: played if the voice file fails to load + user: core + + *: "" + + + *: "" + + + *: "Ugyldig stemmefil" + + + + id: VOICE_LANG_NAME + desc: Spoken name of the language + user: core + + *: "" + + + *: "" + + + *: "Nynorsk" + + + + id: LANG_PERCENT_FORMAT + desc: percent formatting ( `10%` is default , for `10 %` use '%ld %%' , for `%10` use '%%%ld' and so on) + user: core + + *: "%ld%%" + + + *: "%ld%%" + + + *: none + + + + id: LANG_CHOOSE_FILE + desc: file_picker plugin ask user to select a file + user: core + + *: "Choose File" + + + *: "Vel fil" + + + *: "Vel fil" + + + + id: LANG_DISABLE_MAINMENU_SCROLLING + desc: Disable main menu scrolling + user: core + + *: "Disable main menu scrolling" + + + *: "Skru av hovudmenyrulling" + + + *: "Skru av hovudmenyrulling" + + + + id: LANG_REMAINING + desc: Playing Time + user: core + + *: "Remaining" + + + *: "Står att" + + + *: "Står att" + + + + id: LANG_SHOW_FIRST_LETTER + desc: Database menu + user: core + + *: "First Letter" + + + *: "Førebokstav" + + + *: "Førebokstav" + + + + id: LANG_SHOW_BY_FIRST_LETTER + desc: Database menu + user: core + + *: "By First Letter..." + + + *: "Etter førebokstav" + + + *: "Etter førebokstav" + + + + id: LANG_SHOW_ARTISTS_BY_FIRST_LETTER + desc: Database menu + user: core + + *: "Artists by First Letter" + + + *: "Artistar etter førebokstav" + + + *: "Artistar etter førebokstav" + + + + id: LANG_SHOW_ALBUM_ARTISTS_BY_FIRST_LETTER + desc: Database menu + user: core + + *: "Album Artists by First Letter" + + + *: "Albumartistar etter førebokstav" + + + *: "Albumartistar etter førebokstav" + + + + id: LANG_SHOW_ALBUMS_BY_FIRST_LETTER + desc: Database menu + user: core + + *: "Albums by First Letter" + + + *: "Album etter førebokstav" + + + *: "Album etter førebokstav" + + + + id: LANG_SHOW_TRACKS_BY_FIRST_LETTER + desc: Database menu + user: core + + *: "Tracks by First Letter" + + + *: "Spor etter førebokstav" + + + *: "Spor etter førebokstav" + + + + id: LANG_ARTISTS + desc: Database menu + user: core + + *: "Artists" + + + *: "Artistar" + + + *: "Artistar" + + + + id: LANG_ALBUMS + desc: Database menu + user: core + + *: "Albums" + + + *: "Album" + + + *: "Album" + + + + id: LANG_TRACKS + desc: Database menu + user: core + + *: "Tracks" + + + *: "Spor" + + + *: "Spor" + + + + id: LANG_SHUFFLE_SONGS + desc: Database menu + user: core + + *: "Shuffle Songs" + + + *: "Spel songar tilfeldig" + + + *: "Spel songar tilfeldig" + + + + id: LANG_FILENAME + desc: Database and recording menus + user: core + + *: "Filename" + + + *: "Filnamn" + + + *: "Filnamn" + + + + id: LANG_TITLE_WITH_DURATION + desc: Database menu + user: core + + *: "Title (with track duration)" + + + *: "Tittel (med tid)" + + + *: "Tittel med tid" + + + + id: LANG_USER_RATING + desc: Database menu + user: core + + *: "User Rating" + + + *: "Brukarrangering" + + + *: "Brukarrangering" + + + + id: LANG_SEARCH + desc: Database menu + user: core + + *: "Search" + + + *: "Søk" + + + *: "Søk" + + + + id: LANG_SEARCH_BY + desc: Database menu + user: core + + *: "Search by..." + + + *: "Søk etter..." + + + *: "Søk etter" + + + + id: LANG_RECENTLY_ADDED + desc: Database menu + user: core + + *: "Recently Added" + + + *: "Nyst lagt til" + + + *: "Nyst lagt til" + + + + id: LANG_PLAYBACK_HISTORY + desc: Database menu + user: core + + *: "Playback History" + + + *: "Sist spelt" + + + *: "Sist spelt" + + + + id: LANG_CUSTOM_MENU + desc: Database menu + user: core + + *: "Custom menu" + + + *: "Eigen meny" + + + *: "Eigen meny" + + + + id: LANG_SAME_AS_CURRENT + desc: Database menu + user: core + + *: "Same as currently played track" + + + *: "Same som noverande spor" + + + *: "Same som noverande spor" + + + + id: LANG_DIRECTORY + desc: Database menu + user: core + + *: "Directory" + + + *: "Mappe" + + + *: "Mappe" + + + + id: LANG_ALBUMS_BY_YEAR + desc: Database menu + user: core + + *: "Albums by Year" + + + *: "Album etter år" + + + *: "Album etter år" + + + + id: LANG_ALBUMS_BETWEEN_YEARS + desc: Database menu + user: core + + *: "Albums between Years" + + + *: "Album mellom åra" + + + *: "Album mellom åra" + + + + id: LANG_ARTISTS_BETWEEN_YEARS + desc: Database menu + user: core + + *: "Artists between Years" + + + *: "Artistar mellom åra" + + + *: "Artistar mellom åra" + + + + id: LANG_HISTORY_MOST_PLAYED + desc: Database menu + user: core + + *: "Most played (Plays|Score)" + + + *: "Mest spelte (Avspelingar|Vurdering)" + + + *: "Mest spelte etter avspelingar og så vurdering" + + + + id: LANG_HISTORY_RECENTLY_PLAYED_TRACKS + desc: Database menu + user: core + + *: "Recently played tracks" + + + *: "Sist spelte spor" + + + *: "Sist spelte spor" + + + + id: LANG_HISTORY_NEVER_PLAYED_TRACKS + desc: Database menu + user: core + + *: "Never played tracks" + + + *: "Aldri spelte spor" + + + *: "Aldri spelte spor" + + + + id: LANG_HISTORY_FAVOURITE_ARTISTS + desc: Database menu + user: core + + *: "Favourite artists" + + + *: "Favorittartist" + + + *: "Favorittartist" + + + + id: LANG_HISTORY_FAVOURITE_ALBUMS + desc: Database menu + user: core + + *: "Favourite albums" + + + *: "Favorittalbum" + + + *: "Favorittalbum" + + + + id: LANG_HISTORY_RECENT_FAVOURITES + desc: Database menu + user: core + + *: "Recent favourites" + + + *: "Siste favorittar" + + + *: "Siste favorittar" + + + + id: LANG_HISTORY_NEW_FAVOURITES + desc: Database menu + user: core + + *: "New favourites" + + + *: "Nye favorittar" + + + *: "Nye favorittar" + + + + id: LANG_HISTORY_FORGOTTEN_FAVOURITES + desc: Database menu + user: core + + *: "Forgotten favourites" + + + *: "Gløymde favorittar" + + + *: "Gløymde favorittar" + + + + id: LANG_TRACKS_BY + desc: Database menu + user: core + + *: "Tracks by" + + + *: "Spor etter" + + + *: "Spor etter" + + + + id: LANG_VIEW_ALBUMART + desc: WPS context menu + user: core + + *: "View Album Art" + + + *: "Vis omslag" + + + *: "Vis omslag" + + + + id: LANG_TAGNAVI_ALL_TRACKS_SORTED_BY_ALBUM + desc: "[By album]" entry in tag browser + user: core + + *: "[By album]" + + + *: "[Etter album]" + + + *: "Alle spor sorterte etter album" + + + + id: LANG_HP_LO_SELECT + desc: Output Select + user: core + + *: none + erosqnative: "Output Select" + + + *: none + erosqnative: "Vel utgang" + + + *: none + erosqnative: "Vel utgang" + + + + id: LANG_HEADPHONE + desc: in settings_menu + user: core + + *: none + erosqnative: "Headphone" + + + *: none + erosqnative: "Øyreklokker" + + + *: none + erosqnative: "Øyreklokker" + + + + id: LANG_LINEOUT + desc: in settings_menu + user: core + + *: none + erosqnative,lineout_poweroff: "Line Out" + + + *: none + erosqnative,lineout_poweroff: "Lineutgang" + + + *: none + erosqnative,lineout_poweroff: "Lineutgang" + + + + id: LANG_FONT_LOAD_ERROR + desc: Displayed when font loading fails + user: core + + *: "Unable to load font: (%s)" + + + *: "Greidde ikkje lasta skrift: (%s)" + + + *: "Greidde ikkje lasta skrift" + + + + id: LANG_LOGGING + desc: playback logging + user: core + + *: "Logging" + + + *: "~Logging" + + + *: "~logging" + + + + id: LANG_VIEWLOG + desc: view Log + user: core + + *: "View log" + + + *: "Sjå loggen" + + + *: "sjå loggen" + + + + id: LANG_REPLAY_FINISHED_PLAYLIST + desc: Resume playback of finished playlist + user: core + + *: "Playlist finished. Play again?" + + + *: "Spelelista er ferdig. Spel på nytt?" + + + *: "Spelelista er ferdig. Spel på nytt?" + + + + id: LANG_SORT_PLAYLISTS + desc: playlists sorting setting + user: core + + *: "Sort Playlists" + + + *: "Sorter spelelister" + + + *: "sorter spelelister" + + + + id: LANG_USE_LED_INDICATORS + desc: LED indicators setting + user: core + + *: none + general_purpose_led: "Use LED indicators" + + + *: none + general_purpose_led: "Bruk LED-indikatorar" + + + *: none + general_purpose_led: "Bruk LED-indikatorar" + + + + id: LANG_KEEP_DIRECTORY + desc: file browser setting + user: core + + *: "Always remember last folder" + + + *: "Alltid hugs siste mappe" + + + *: "Alltid hugs siste mappe" + + diff --git a/apps/lang/russian.lang b/apps/lang/russian.lang index 01df4bb766..3866b360b3 100644 --- a/apps/lang/russian.lang +++ b/apps/lang/russian.lang @@ -13142,20 +13142,6 @@ *: "в сторону ферзя" - - id: LANG_PLAYTIME_ERROR - desc: playing time screen - user: core - - *: "Error while gathering info" - - - *: "Сбой при сборе информации" - - - *: "Сбой при сборе информации" - - id: LANG_CLEAR_ALL_RESUMES desc: in the mpegplayer settings menu @@ -14389,7 +14375,7 @@ user: core *: "Press LEFT to cancel." - android,hifietma*,zenvision: "Press BACK to cancel." + android,hifietma*: "Press BACK to cancel." cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." ihifi760,ihifi960: "Double tap RETURN to cancel." ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." @@ -14404,7 +14390,7 @@ *: "Нажмите ВЛЕВО для отмены." - android,hifietma*,zenvision: "Нажмите НАЗАД для отмены." + android,hifietma*: "Нажмите НАЗАД для отмены." cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Нажмите ВКЛ. для отмены." ihifi760,ihifi960: "Дважды нажмите ВОЗВРАТ для отмены." ihifi770,ihifi770c,ihifi800: "Нажмите ДОМОЙ для отмены." @@ -14419,7 +14405,7 @@ *: "Нажмите кнопку Влево для отмены." - android,hifietma*,zenvision: "Нажмите кнопку Назад для отмены." + android,hifietma*: "Нажмите кнопку Назад для отмены." cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Нажмите кнопку включения для отмены." ihifi760,ihifi960: "Дважды нажмите кнопку Назад для отмены." ihifi770,ihifi770c,ihifi800: "Нажмите кнопку Домой для отмены." @@ -15790,13 +15776,13 @@ id: LANG_VOICED_DATE_FORMAT - desc: format string for how dates will be read back. Y == 4-digit year, A == month name, m == numeric month, d == numeric day. For example, "AdY" will read "January 21 2021" + desc: format string for how dates will be read back. Y == 4-digit year (grouped), y == 4-digit year (numeric), A == month name, m == numeric month, d == numeric day. For example, for 2021-01-05, "AdY" will be voiced as "January 5 twenty twenty-one" and "dmy" will be voiced as "5 1 two thousand twenty one user: core *: "dAY" - *: "~dAY" + *: "dAy" *: "" @@ -15872,20 +15858,6 @@ *: "Браузер по умолчанию" - - id: LANG_AMAZE_MENU - desc: Amaze game - user: core - - *: "Amaze Main Menu" - - - *: "Главное меню Amaze" - - - *: "Главное меню Amaze" - - id: LANG_SET_MAZE_SIZE desc: Maze size in Amaze game @@ -16138,34 +16110,6 @@ *: "Настройки Mik mod" - - id: LANG_MIKMOD_MENU - desc: mikmod plugin - user: core - - *: "Mikmod Menu" - - - *: "Меню Mikmod" - - - *: "Меню Mik mod" - - - - id: LANG_CHESSBOX_MENU - desc: chessbox plugin - user: core - - *: "Chessbox Menu" - - - *: "Меню Chessbox" - - - *: "Меню Chessbox" - - id: VOICE_INVALID_VOICE_FILE desc: played if the voice file fails to load @@ -16999,3 +16943,48 @@ *: "Все трэки сортируются по альбому" + + id: LANG_ANNOUNCE_STATUS + desc: announnnce_status plugin + user: core + + *: "Announce Status" + + + *: "Объявлять статус" + + + *: "Объявлять статус" + + + + id: LANG_USE_LED_INDICATORS + desc: LED indicators setting + user: core + + *: none + general_purpose_led: "Use LED indicators" + + + *: none + general_purpose_led: "Использовать LED индикаторы" + + + *: none + general_purpose_led: "Использовать LED индикаторы" + + + + id: LANG_KEEP_DIRECTORY + desc: file browser setting + user: core + + *: "Always remember last folder" + + + *: "Всегда запоминать последнюю папку" + + + *: "Всегда запоминать последнюю папку" + + diff --git a/apps/misc.c b/apps/misc.c index 40a55d032f..a44f106fb9 100644 --- a/apps/misc.c +++ b/apps/misc.c @@ -866,20 +866,10 @@ void check_bootfile(bool do_rolo) #endif #endif -/* check range, set volume and save settings */ +/* set volume and save settings */ void setvol(void) { - const int min_vol = sound_min(SOUND_VOLUME); - const int max_vol = sound_max(SOUND_VOLUME); - int volume = global_status.volume; - if (volume < min_vol) - volume = min_vol; - if (volume > max_vol) - volume = max_vol; - if (volume > global_settings.volume_limit) - volume = global_settings.volume_limit; - - sound_set_volume(volume); + sound_set_volume(global_status.volume); global_status.last_volume_change = current_tick; status_save(false); } diff --git a/apps/plugins/disktidy.config b/apps/plugins/disktidy.config index a5f31df5e7..98bb77e6e6 100644 --- a/apps/plugins/disktidy.config +++ b/apps/plugins/disktidy.config @@ -19,9 +19,13 @@ .Trashes/: no .Spotlight-V100/: no .DS_Store: no + __MACOSX/: no ._*: no < Linux/BSD >: no .Trash-*/: no .dolphinview: no .d3lphinview: no +< Android >: no + Android/: no + LOST.DIR/: no < Other >: no diff --git a/apps/plugins/midi/midiplay.c b/apps/plugins/midi/midiplay.c index 2689e96ba1..d19ff7888b 100644 --- a/apps/plugins/midi/midiplay.c +++ b/apps/plugins/midi/midiplay.c @@ -381,6 +381,8 @@ struct MIDIfile * mf IBSS_ATTR; +int sample_rate IBSS_ATTR; +int max_voices IBSS_ATTR; int number_of_samples IBSS_ATTR; /* the number of samples in the current tick */ int playing_time IBSS_ATTR; /* How many seconds into the file have we been playing? */ int samples_this_second IBSS_ATTR; /* How many samples produced during this second so far? */ @@ -490,11 +492,56 @@ static void get_more(const void** start, size_t* size) *size = samples_in_buf*sizeof(int32_t); } +UNUSED_ATTR static int find_min_sampr_ge_22(void) +{ + const struct pcm_sink_caps* caps = rb->pcm_current_sink_caps(); + int ret = caps->samprs[0]; + for (size_t i = 1; i < caps->num_samprs; i += 1) + { + /* caps->samprs is in descending order */ + if (caps->samprs[i] >= SAMPR_22) + ret = caps->samprs[i]; + else + break; + } + return ret; +} + static int midimain(const void * filename) { int a, notes_used, vol; bool is_playing = true; /* false = paused */ + /* decide sample_rate and max_voices */ +#if defined(SIMULATOR) /* Simulator requires 44100Hz, and we can afford to use more voices */ || \ + (CONFIG_PLATFORM & PLATFORM_HOSTED) /* All hosted targets have CPU to spare */ || \ + defined(CPU_MIPS) /* All MIPS targets are pretty fast */ + sample_rate = SAMPR_44; + max_voices = 48; +#elif defined(CPU_PP) + /* Some of the pp based targets can't handle too many voices + mainly because they have to use 44100Hz sample rate, this could be + improved to increase max_voices for targets that can do 22kHz */ + sample_rate = find_min_sampr_ge_22(); + max_voices = sample_rate == SAMPR_22 ? 24 : 16; +#elif defined(CPU_ARM) + /* ARMv4 targets are slow, but treat everything else as fast */ +#if (ARM_ARCH >= 6) + sample_rate = SAMPR_44; + max_voices = 32; +#elif (ARM_ARCH >= 5) + sample_rate = find_min_sampr_ge_22(); + max_voices = 32; +#else /* ie v4 */ + sample_rate = find_min_sampr_ge_22(); + max_voices = sample_rate == SAMPR_22 ? 24 : 16; +#endif +#else /* !CPU_ARM */ + /* Treat everything else as slow */ + sample_rate = find_min_sampr_ge_22(); + max_voices = sample_rate == SAMPR_22 ? 24 : 16; +#endif + #if defined(HAVE_ADJUSTABLE_CPU_FREQ) rb->cpu_boost(true); #endif @@ -537,7 +584,7 @@ static int midimain(const void * filename) rb->dsp_set_timestretch(PITCH_SPEED_100); #endif rb->dsp_configure(dsp, DSP_SET_SAMPLE_DEPTH, 22); - rb->dsp_configure(dsp, DSP_SET_FREQUENCY, SAMPLE_RATE); /* 44100 22050 11025 */ + rb->dsp_configure(dsp, DSP_SET_FREQUENCY, sample_rate); /* 44100 22050 11025 */ rb->dsp_configure(dsp, DSP_SET_STEREO_MODE, STEREO_INTERLEAVED); /* @@ -553,14 +600,14 @@ static int midimain(const void * filename) midi_debug("Okay, starting sequencing"); bpm = mf->div*1000000/tempo; - number_of_samples = SAMPLE_RATE/bpm; + number_of_samples = sample_rate/bpm; /* Skip over any junk in the beginning of the file, so start playing */ /* after the first note event */ do { notes_used = 0; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) if (voices[a].isUsed) notes_used++; tick(); diff --git a/apps/plugins/midi/midiutil.c b/apps/plugins/midi/midiutil.c index b9e57a405b..7438455ca3 100644 --- a/apps/plugins/midi/midiutil.c +++ b/apps/plugins/midi/midiutil.c @@ -35,7 +35,7 @@ struct GPatch * gusload(char *); struct GPatch * patchSet[128]; struct GPatch * drumSet[128]; -struct SynthObject voices[MAX_VOICES] IBSS_ATTR; +struct SynthObject voices[48] IBSS_ATTR; static void *alloc(int size) { diff --git a/apps/plugins/midi/midiutil.h b/apps/plugins/midi/midiutil.h index ee9769b108..71da7461e3 100644 --- a/apps/plugins/midi/midiutil.h +++ b/apps/plugins/midi/midiutil.h @@ -27,67 +27,6 @@ #define NBUF 2 #define MAX_SAMPLES 512 -#ifdef SIMULATOR - -/* Simulator requires 44100Hz, and we can afford to use more voices */ -#define SAMPLE_RATE SAMPR_44 -#define MAX_VOICES 48 - -#elif (CONFIG_PLATFORM & PLATFORM_HOSTED) - -/* All hosted targets have CPU to spare */ -#define MAX_VOICES 48 -#define SAMPLE_RATE SAMPR_44 - -#elif defined(CPU_PP) - -/* Some of the pp based targets can't handle too many voices - mainly because they have to use 44100Hz sample rate, this could be - improved to increase MAX_VOICES for targets that can do 22kHz */ -#define SAMPLE_RATE HW_SAMPR_MIN_GE_22 -#if HW_SAMPR_CAPS & SAMPR_CAP_22 -#define MAX_VOICES 24 /* General MIDI minimum */ -#else -#define MAX_VOICES 16 -#endif - -#elif defined(CPU_MIPS) - -/* All MIPS targets are pretty fast */ -#define MAX_VOICES 48 -#define SAMPLE_RATE SAMPR_44 - -#elif defined(CPU_ARM) - -/* ARMv4 targets are slow, but treat everything else as fast */ - -#if (ARM_ARCH >= 6) -#define MAX_VOICES 32 -#define SAMPLE_RATE SAMPR_44 -#elif (ARM_ARCH >= 5) -#define MAX_VOICES 32 -#define SAMPLE_RATE HW_SAMPR_MIN_GE_22 -#else /* ie v4 */ -#define SAMPLE_RATE HW_SAMPR_MIN_GE_22 -#if HW_SAMPR_CAPS & SAMPR_CAP_22 -#define MAX_VOICES 24 /* General MIDI minimum */ -#else -#define MAX_VOICES 16 -#endif -#endif /* ARM_ARCH < 5*/ - -#else /* !CPU_ARM */ - -/* Treat everything else as slow */ -#define SAMPLE_RATE HW_SAMPR_MIN_GE_22 -#if HW_SAMPR_CAPS & SAMPR_CAP_22 -#define MAX_VOICES 24 /* General MIDI minimum */ -#else -#define MAX_VOICES 16 -#endif - -#endif /* Wrap it up. */ - #define BYTE unsigned char /* Data chunk ID types, returned by readID() */ @@ -189,7 +128,7 @@ void * readData(int file, int len); #define malloc(n) my_malloc(n) void * my_malloc(int size); -extern struct SynthObject voices[MAX_VOICES]; +extern struct SynthObject voices[48]; /* 48: maximum possible max_voices */ extern int chVol[16]; /* Channel volume */ extern int chPan[16]; /* Channel panning */ @@ -207,6 +146,8 @@ extern struct GPatch * drumSet[128]; extern struct MIDIfile * mf; +extern int sample_rate; +extern int max_voices; extern int number_of_samples; extern int playing_time IBSS_ATTR; extern int samples_this_second IBSS_ATTR; diff --git a/apps/plugins/midi/sequencer.c b/apps/plugins/midi/sequencer.c index d35a057c32..ce4aa6628a 100644 --- a/apps/plugins/midi/sequencer.c +++ b/apps/plugins/midi/sequencer.c @@ -65,7 +65,7 @@ static inline void setVol(int ch, int vol) /* If channel volume changes, we need to recalculate the volume scale */ /* factor for all voices active on this channel */ - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) if (voices[a].ch == ch) setVolScale(a); } @@ -156,7 +156,7 @@ static void findDelta(struct SynthObject * so, int ch, int note) delta = (((freqtable[note+chPBNoteOffset[ch]]))); /* anywhere from 8000 to 8000000 */ delta = delta * wf->sampRate; /* approx 20000 - 44000 but can vary with tuning */ delta = (delta * chPBFractBend[ch]); /* approx 60000 - 70000 */ - delta = delta / (SAMPLE_RATE); /* 44100 or 22050 */ + delta = delta / (sample_rate); /* 44100 or 22050 */ delta = delta / (wf->rootFreq); /* anywhere from 8000 to 8000000 */ /* Pitch bend is encoded as a fractional of 16 bits, hence the 16 */ @@ -167,7 +167,7 @@ static void findDelta(struct SynthObject * so, int ch, int note) static inline void computeDeltas(int ch) { int a; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) { if (voices[a].isUsed && voices[a].ch == ch) { @@ -210,7 +210,7 @@ static inline void pressNote(int ch, int note, int vol) if(ch == 15) return; */ int a; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) { if (voices[a].ch == ch && voices[a].note == note) break; @@ -218,7 +218,7 @@ static inline void pressNote(int ch, int note, int vol) if (!voices[a].isUsed) break; } - if (a == MAX_VOICES) + if (a == max_voices) { // midi_debug("\nVoice kill"); // midi_debug("\nToo many voices playing at once. No more left"); @@ -226,7 +226,7 @@ static inline void pressNote(int ch, int note, int vol) // for(a=0; a<48; a++) // midi_debug("\n#%d Ch=%d Note=%d curRate=%d curOffset=%d curPoint=%d targetOffset=%d", a, voices[a].ch, voices[a].note, voices[a].curRate, voices[a].curOffset, voices[a].curPoint, voices[a].targetOffset); lastKill++; - if (lastKill == MAX_VOICES) + if (lastKill == max_voices) lastKill = 0; a = lastKill; // return; /* None available */ @@ -263,7 +263,7 @@ static inline void pressNote(int ch, int note, int vol) struct GWaveform * wf = drumSet[note]->waveforms[0]; voices[a].wf = wf; - voices[a].delta = (((freqtable[note]<rootFreq) * wf->sampRate / SAMPLE_RATE); + voices[a].delta = (((freqtable[note]<rootFreq) * wf->sampRate / sample_rate); if (wf->mode & 28) // midi_debug("\nWoah, a drum patch has a loop. Stripping the loop..."); wf->mode = wf->mode & (255-28); @@ -285,7 +285,7 @@ static void releaseNote(int ch, int note) return; int a; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) { if (voices[a].ch == ch && voices[a].note == note) { @@ -432,7 +432,7 @@ int tick(void) tempo = (((short)e->evData[0])<<16)|(((short)e->evData[1])<<8)|(e->evData[2]); /* midi_debug("\nMeta-Event: Tempo Set = %d", tempo); */ bpm=mf->div*1000000/tempo; - number_of_samples=SAMPLE_RATE/bpm; + number_of_samples=sample_rate/bpm; } } @@ -446,9 +446,9 @@ int tick(void) samples_this_second += number_of_samples; - while (samples_this_second >= SAMPLE_RATE) + while (samples_this_second >= sample_rate) { - samples_this_second -= SAMPLE_RATE; + samples_this_second -= sample_rate; playing_time++; } @@ -471,7 +471,7 @@ void seekBackward(int nsec) /* Set the tempo to defalt */ bpm = mf->div*1000000/tempo; - number_of_samples = SAMPLE_RATE/bpm; + number_of_samples = sample_rate/bpm; /* Reset the tracks to start */ rewindFile(); @@ -484,7 +484,7 @@ void seekBackward(int nsec) do { notes_used = 0; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) if (voices[a].isUsed) notes_used++; tick(); diff --git a/apps/plugins/midi/synth.c b/apps/plugins/midi/synth.c index f199d544e5..3143e61a4f 100644 --- a/apps/plugins/midi/synth.c +++ b/apps/plugins/midi/synth.c @@ -46,7 +46,7 @@ static void readTextBlock(int file, char * buf) void resetControllers() { int a=0; - for(a=0; amemset(buf_ptr, 0, nsamples * 2 * sizeof(int32_t)); - for(i=0; i < MAX_VOICES; i++) + for(i=0; i < max_voices; i++) { voicept=&voices[i]; if(voicept->isUsed) diff --git a/apps/plugins/pacbox/pacbox.c b/apps/plugins/pacbox/pacbox.c index a8208f1e51..34f103039d 100644 --- a/apps/plugins/pacbox/pacbox.c +++ b/apps/plugins/pacbox/pacbox.c @@ -395,19 +395,19 @@ static void start_sound(void) #endif /* Get the closest rate >= to what is preferred */ + const struct pcm_sink_caps* caps = rb->pcm_current_sink_caps(); sr_index = rb->round_value_to_list32(PREFERRED_SAMPLING_RATE, - rb->hw_freq_sampr, HW_NUM_FREQ, false); + caps->samprs, caps->num_samprs, false); - if (rb->hw_freq_sampr[sr_index] < PREFERRED_SAMPLING_RATE - && sr_index > 0) + if (caps->samprs[sr_index] < PREFERRED_SAMPLING_RATE && sr_index > 0) { /* Round up */ sr_index--; } - wsg3_set_sampling_rate(rb->hw_freq_sampr[sr_index]); + wsg3_set_sampling_rate(caps->samprs[sr_index]); - rb->mixer_set_frequency(rb->hw_freq_sampr[sr_index]); + rb->mixer_set_frequency(caps->samprs[sr_index]); rb->mixer_channel_play_data(PCM_MIXER_CHAN_PLAYBACK, get_more, NULL, 0); sound_playing = true; diff --git a/apps/plugins/pdbox/pdbox.c b/apps/plugins/pdbox/pdbox.c index 08236bfeba..78d6037fa6 100644 --- a/apps/plugins/pdbox/pdbox.c +++ b/apps/plugins/pdbox/pdbox.c @@ -188,6 +188,26 @@ enum plugin_status plugin_start(const void* parameter) /* Set audio API. */ sys_set_audio_api(API_ROCKBOX); + /* Determine sample rate. */ +#if defined(SIMULATOR) +#define PREFERRED_SAMPR SAMPR_44 +#else +#define PREFERRED_SAMPR SAMPR_22 +#endif + int samplerate; + { + int i; + const struct pcm_sink_caps* caps = rb->pcm_current_sink_caps(); + for (i = 0; i < caps->num_samprs; i++) { + if (caps->samprs[i] == PREFERRED_SAMPR) + break; + } + if (i == caps->num_samprs) + samplerate = SAMPR_44; + else + samplerate = caps->samprs[i]; + } + /* Initialize audio subsystem. */ sys_open_audio(0, /* No sound input yet */ sys_soundindevlist, @@ -197,7 +217,7 @@ enum plugin_status plugin_start(const void* parameter) sys_soundoutdevlist, -1, /* Use the default amount (2) of channels */ sys_choutlist, - PD_SAMPLERATE, /* Sample rate */ + samplerate, /* Sample rate */ DEFAULTADVANCE, /* Scheduler advance */ 1 /* Enable */); diff --git a/apps/plugins/pdbox/pdbox.h b/apps/plugins/pdbox/pdbox.h index 8dcb152479..36fb6c4fa8 100644 --- a/apps/plugins/pdbox/pdbox.h +++ b/apps/plugins/pdbox/pdbox.h @@ -40,17 +40,9 @@ #define calloc(elements, elem_size) tlsf_calloc(elements, elem_size) /* Audio declarations. */ -#ifdef SIMULATOR - #define PD_SAMPLERATE 44100 -#elif (HW_SAMPR_CAPS & SAMPR_CAP_22) - #define PD_SAMPLERATE 22050 -#elif (HW_SAMPR_CAPS & SAMPR_CAP_32) - #define PD_SAMPLERATE 32000 -#elif (HW_SAMPR_CAPS & SAMPR_CAP_44) - #define PD_SAMPLERATE 44100 -#else - #error No sufficient sample rate available! -#endif +/* Maximum sample rate; used for buffer sizing. + * Actual rate is determined at runtime from pcm sink capabilities. */ +#define PD_SAMPLERATE 44100 #define PD_SAMPLES_PER_HZ ((PD_SAMPLERATE / HZ) + \ (PD_SAMPLERATE % HZ > 0 ? 1 : 0)) #define PD_OUT_CHANNELS 2 diff --git a/apps/plugins/xrick/system/syssnd_rockbox.c b/apps/plugins/xrick/system/syssnd_rockbox.c index afd0766863..74edd98140 100644 --- a/apps/plugins/xrick/system/syssnd_rockbox.c +++ b/apps/plugins/xrick/system/syssnd_rockbox.c @@ -222,8 +222,8 @@ void syssnd_update(void) if (!isAudioPlaying && fillCount > 0) { - rb->mixer_channel_play_data(PCM_MIXER_CHAN_PLAYBACK, get_more, NULL, 0); isAudioPlaying = true; + rb->mixer_channel_play_data(PCM_MIXER_CHAN_PLAYBACK, get_more, NULL, 0); } } } diff --git a/docs/CREDITS b/docs/CREDITS index fa6e3c3b44..06045db966 100644 --- a/docs/CREDITS +++ b/docs/CREDITS @@ -758,6 +758,8 @@ Ingmar Steen Lourenço Soares Yegor Chernyshov Javier Gutiérrez Gertrúdix +Sergey Puskov +Eivind Ødegård The libmad team The wavpack team diff --git a/firmware/SOURCES b/firmware/SOURCES index 14365f965e..888d296fd0 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -527,12 +527,11 @@ drivers/rds.c #endif /* HAVE_RDS_CAP */ #endif /* PLATFORM_NATIVE */ #endif /* CONFIG_TUNER */ -#endif /* BOOTLOADER */ +#endif /* !BOOTLOADER */ /* Sound */ -sound.c - #ifndef BOOTLOADER +sound.c pcm_sampr.c pcm.c pcm_mixer.c @@ -544,7 +543,7 @@ enc_base.c #endif /* HAVE_RECORDING */ drivers/audio/audiohw-swcodec.c -#endif /* BOOTLOADER */ +#endif /* !BOOTLOADER */ /* Audio codec */ #if !defined(BOOTLOADER) diff --git a/firmware/export/config.h b/firmware/export/config.h index 587da6c496..4cd178e405 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -1362,6 +1362,13 @@ Lyre prototype 1 */ //#define USB_HAS_INTERRUPT -- seems to be broken #endif /* CONFIG_USBOTG */ +#if CONFIG_USBOTG == USBOTG_ARC +#define USB_BATCH_SLOTS 16 +#else +#define USB_BATCH_NON_NATIVE +#define USB_BATCH_SLOTS 1 +#endif + /* define the class drivers to enable */ #ifdef BOOTLOADER diff --git a/firmware/export/pcm_sink.h b/firmware/export/pcm_sink.h index 27c0c31db1..77c64428f6 100644 --- a/firmware/export/pcm_sink.h +++ b/firmware/export/pcm_sink.h @@ -47,6 +47,7 @@ struct pcm_sink { /* runtime states */ unsigned long pending_freq; unsigned long configured_freq; + unsigned long pcm_is_ready; }; enum pcm_sink_ids { diff --git a/firmware/export/usb_drv.h b/firmware/export/usb_drv.h index ea048a3cd1..6c8949200d 100644 --- a/firmware/export/usb_drv.h +++ b/firmware/export/usb_drv.h @@ -109,6 +109,23 @@ int usb_drv_deinit_endpoint(int endpoint); int usb_drv_get_frame_number(void); #endif +/* batched request api is for workloads that perform very high-frequency, + * performance-sensitive isochronous transactions continuously. + * this api allows multiple transaction requests to be buffered in udc driver. + * so that it can maximize the controller's performance. */ + +/* called when usb system requires more buffer */ +typedef void(*usb_drv_batch_get_more)(const void** ptr, size_t* len); + +/* prepare request queue */ +int usb_drv_batch_init(int ep, usb_drv_batch_get_more get_more); +/* destroy request queue */ +int usb_drv_batch_deinit(void); +/* start processing */ +int usb_drv_batch_start(void); +/* stop processing */ +int usb_drv_batch_stop(void); + /* USB_STRING_INITIALIZER(u"Example String") */ #define USB_STRING_INITIALIZER(S) { \ sizeof(struct usb_string_descriptor) + sizeof(S) - sizeof(*S), \ diff --git a/firmware/pcm.c b/firmware/pcm.c index 08383ace2d..eebcf70e1c 100644 --- a/firmware/pcm.c +++ b/firmware/pcm.c @@ -76,9 +76,6 @@ * */ -/* 'true' when all stages of pcm initialization have completed */ -static bool pcm_is_ready = false; - static struct pcm_sink* sinks[1] = { [PCM_SINK_BUILTIN] = &builtin_pcm_sink, }; @@ -142,7 +139,7 @@ void pcm_play_stop_int(void) static void pcm_wait_for_init(void) { - while (!pcm_is_ready) + while (!sinks[cur_sink]->pcm_is_ready) sleep(0); } @@ -205,7 +202,7 @@ void pcm_do_peak_calculation(struct pcm_peaks *peaks, bool active, if (active) { struct pcm_sink* sink = sinks[cur_sink]; - if (sink->configured_freq == -1UL) + if (sink->configured_freq == -1U) { logf("not configured yet"); return; @@ -251,9 +248,11 @@ void pcm_init(void) logf("pcm_init"); for(size_t i = 0; i < ARRAYLEN(sinks); i += 1) { - sinks[i]->pending_freq = sinks[i]->caps.default_freq; - sinks[i]->configured_freq = -1UL; - sinks[i]->ops.init(); + struct pcm_sink* sink = sinks[i]; + sink->pending_freq = sink->caps.default_freq; + sink->configured_freq = -1U; + sink->pcm_is_ready = false; + sink->ops.init(); } } @@ -263,15 +262,18 @@ void pcm_postinit(void) logf("pcm_postinit"); for(size_t i = 0; i < ARRAYLEN(sinks); i += 1) { - sinks[i]->ops.postinit(); + struct pcm_sink* sink = sinks[i]; + sink->ops.postinit(); + sink->pcm_is_ready = true; } - pcm_is_ready = true; + /* Ensure mixer is in a sane state */ + mixer_set_frequency(pcm_get_frequency()); } bool pcm_is_initialized(void) { - return pcm_is_ready; + return sinks[cur_sink]->pcm_is_ready; } enum pcm_sink_ids pcm_current_sink(void) diff --git a/firmware/pcm_mixer.c b/firmware/pcm_mixer.c index d36560f149..a0d26fc86d 100644 --- a/firmware/pcm_mixer.c +++ b/firmware/pcm_mixer.c @@ -33,7 +33,7 @@ before the last samples are sent to the codec and so things are done in parallel (as much as possible) with sending-out data. */ -static unsigned int mixer_sampr = HW_SAMPR_DEFAULT; +static unsigned int mixer_sampr = -1U; static unsigned int mix_frame_size = MIX_FRAME_SAMPLES*4; /* Define this to nonzero to add a marker pulse at each frame start */ @@ -266,7 +266,10 @@ static void mixer_start_pcm(void) #endif /* Requires a shared global sample rate for all channels */ - pcm_set_frequency(mixer_sampr); + if (mixer_sampr == -1U) + mixer_sampr = pcm_get_frequency(); + else + pcm_set_frequency(mixer_sampr); /* Prepare initial frames and set up the double buffer */ mixer_buffer_callback(PCM_DMAST_STARTED); diff --git a/firmware/sound.c b/firmware/sound.c index 0e43f38f5a..06f6906b55 100644 --- a/firmware/sound.c +++ b/firmware/sound.c @@ -313,6 +313,16 @@ void sound_set_volume(int value) return; #ifndef BOOTLOADER + /* Apply limits */ + const int min_vol = sound_min(SOUND_VOLUME); + const int max_vol = sound_max(SOUND_VOLUME); + if (value < min_vol) + value = min_vol; + if (value > max_vol) + value = max_vol; + if (value > global_settings.volume_limit) + value = global_settings.volume_limit; + global_status.volume = value; #endif diff --git a/firmware/target/arm/as3525/pcm-as3525.c b/firmware/target/arm/as3525/pcm-as3525.c index a5a9ee0cee..b72070b312 100644 --- a/firmware/target/arm/as3525/pcm-as3525.c +++ b/firmware/target/arm/as3525/pcm-as3525.c @@ -189,7 +189,7 @@ static void sink_dma_init(void) I2SOUT_CONTROL = (1<<6) | (1<<3); /* enable dma, stereo */ audiohw_preinit(); - sink_set_freq(HW_SAMPR_DEFAULT); + sink_set_freq(builtin_pcm_sink.caps.default_freq); } #ifdef HAVE_PCM_DMA_ADDRESS diff --git a/firmware/target/arm/stm32/debug-stm32h7.c b/firmware/target/arm/stm32/debug-stm32h7.c index f8cd7200c3..4002876e28 100644 --- a/firmware/target/arm/stm32/debug-stm32h7.c +++ b/firmware/target/arm/stm32/debug-stm32h7.c @@ -89,8 +89,6 @@ static bool swd_menu(void) #if defined(ECHO_R1) extern volatile int pcm_sai_xrun_count; extern volatile int pcm_dma_teif_count; -extern volatile int pcm_dma_dmeif_count; -extern volatile int pcm_dma_feif_count; struct pcmdebug_counter { @@ -102,8 +100,6 @@ static const struct pcmdebug_counter pcmdebug_counters[] = { {"SAI xrun count", &pcm_sai_xrun_count}, {"DMA TEIF count", &pcm_dma_teif_count}, - {"DMA DMEIF count", &pcm_dma_dmeif_count}, - {"DMA FEIF count", &pcm_dma_feif_count}, }; static int pcmdebug_menu_action_cb(int action, struct gui_synclist *lists) diff --git a/firmware/target/arm/stm32/echoplayer/pcm-echoplayer.c b/firmware/target/arm/stm32/echoplayer/pcm-echoplayer.c index c1d457ef8d..1867b21de0 100644 --- a/firmware/target/arm/stm32/echoplayer/pcm-echoplayer.c +++ b/firmware/target/arm/stm32/echoplayer/pcm-echoplayer.c @@ -36,19 +36,16 @@ # define PCM_NATIVE_SAMPLE_SIZE 4 # define DMA_PSIZE_VAL BV_DMA_CHN_CR_PSIZE_32BIT # define SAI_DSIZE_VAL BV_SAI_SUBBLOCK_CR1_DS_32BIT -# define SAI_FIFO_THRESH BV_SAI_SUBBLOCK_CR2_FTH_QUARTER # define SAI_FRL_VAL 64 #elif PCM_NATIVE_BITDEPTH == 24 # define PCM_NATIVE_SAMPLE_SIZE 4 # define DMA_PSIZE_VAL BV_DMA_CHN_CR_PSIZE_32BIT # define SAI_DSIZE_VAL BV_SAI_SUBBLOCK_CR1_DS_24BIT -# define SAI_FIFO_THRESH BV_SAI_SUBBLOCK_CR2_FTH_QUARTER # define SAI_FRL_VAL 64 #elif PCM_NATIVE_BITDEPTH == 16 # define PCM_NATIVE_SAMPLE_SIZE 2 # define DMA_PSIZE_VAL BV_DMA_CHN_CR_PSIZE_16BIT # define SAI_DSIZE_VAL BV_SAI_SUBBLOCK_CR1_DS_16BIT -# define SAI_FIFO_THRESH BV_SAI_SUBBLOCK_CR2_FTH_HALF # define SAI_FRL_VAL 32 #else # error "Unsupported PCM bit depth" @@ -67,8 +64,6 @@ static int pcm_last_freq = -1; volatile int pcm_sai_xrun_count; volatile int pcm_dma_teif_count; -volatile int pcm_dma_dmeif_count; -volatile int pcm_dma_feif_count; static void play_dma_start(const void *addr, size_t size) { @@ -105,7 +100,7 @@ static void sai_init(void) /* Configure DMA1 channel 0 */ reg_writelf(dma1_ch0, DMA_CHN_CR, MBURST_V(INCR4), /* 32-bit x 4 burst = 16 bytes */ - PBURST_V(INCR4), /* (16|32)-bit x 4 burst = 8-16 bytes */ + PBURST_V(SINGLE), /* (16|32)-bit x 4 burst = 8-16 bytes */ TRBUFF(0), /* bufferable mode not used for SAI */ DBM(0), /* double buffer mode off */ PL_V(VERYHIGH), /* highest priority */ @@ -117,10 +112,8 @@ static void sai_init(void) DIR_V(MEM_TO_PERIPH), /* read from memory, write to SAI */ PFCTRL_V(DMA), /* DMA is flow controller */ TCIE(1), /* transfer complete interrupt */ - TEIE(1), /* transfer error interrupt */ - DMEIE(1)); /* direct mode error interrupt */ + TEIE(1)); /* transfer error interrupt */ reg_writelf(dma1_ch0, DMA_CHN_FCR, - FEIE(1), /* fifo error interrupt */ DMDIS(1), /* enable fifo mode */ FTH_V(FULL)); /* fifo threshold = 4 words */ @@ -146,7 +139,7 @@ static void sai_init(void) MUTEVAL_V(ZERO_SAMPLE), /* send zero sample on mute */ MUTE(1), /* mute output initially */ TRIS(0), /* don't tri-state outputs */ - FTH(SAI_FIFO_THRESH)); /* fifo threshold (2 or 4 samples) */ + FTH_V(FULL)); /* fifo threshold (2 or 4 samples) */ reg_writelf(sai1a, SAI_SUBBLOCK_FRCR, FSOFF(1), FSPOL(0), FSDEF(1), /* I2S format */ FSALL(SAI_FRL_VAL/2 - 1), /* FS active for half the frame */ @@ -336,22 +329,12 @@ void dma1_ch0_irq_handler(void) size_t size; if (reg_vreadf(lisr, DMA_LISR, TEIF0)) - pcm_dma_teif_count++; - - if (reg_vreadf(lisr, DMA_LISR, DMEIF0)) - pcm_dma_dmeif_count++; - - if (reg_vreadf(lisr, DMA_LISR, FEIF0)) - pcm_dma_feif_count++; - - if (reg_vreadf(lisr, DMA_LISR, TEIF0) || - reg_vreadf(lisr, DMA_LISR, DMEIF0) || - reg_vreadf(lisr, DMA_LISR, FEIF0)) { - reg_assignlf(dma1, DMA_LIFCR, TEIF0(1), DMEIF0(1), FEIF0(1)); - reg_writelf(dma1_ch0, DMA_CHN_CR, EN(0)); + pcm_dma_teif_count++; + reg_assignlf(dma1, DMA_LIFCR, TEIF0(1)); - pcm_play_dma_status_callback(PCM_DMAST_ERR_DMA); + /* TODO: this case may need additional handling */ + pcm_play_dma_complete_callback(PCM_DMAST_ERR_DMA, NULL, NULL); } else if (reg_vreadf(lisr, DMA_LISR, TCIF0)) { diff --git a/firmware/target/arm/usb-drv-arc.c b/firmware/target/arm/usb-drv-arc.c index 1eeee010b3..09c1ade438 100644 --- a/firmware/target/arm/usb-drv-arc.c +++ b/firmware/target/arm/usb-drv-arc.c @@ -362,6 +362,7 @@ static const unsigned int pipe2mask[USB_NUM_ENDPOINTS*2] = { /*-------------------------------------------------------------------------*/ static void transfer_completed(void); static void control_received(void); +static void sof_received(void); static int prime_transfer(int ep_num, void* ptr, int len, bool send, bool wait); static void prepare_td(struct transfer_descriptor* td, struct transfer_descriptor* previous_td, void *ptr, int len,int pipe); @@ -415,6 +416,14 @@ static void usb_drv_reset(void) #endif } +static void td_set_buf_ptr(struct transfer_descriptor* td, const void* ptr){ + td->buff_ptr0 = (unsigned int)ptr; + td->buff_ptr1 = ((unsigned int)ptr & 0xfffff000) + 0x1000; + td->buff_ptr2 = ((unsigned int)ptr & 0xfffff000) + 0x2000; + td->buff_ptr3 = ((unsigned int)ptr & 0xfffff000) + 0x3000; + td->buff_ptr4 = ((unsigned int)ptr & 0xfffff000) + 0x4000; +} + /* One-time driver startup init */ void usb_drv_startup(void) { @@ -544,6 +553,12 @@ void usb_drv_int(void) if (status & USBSTS_PORT_CHANGE) { REG_USBSTS = USBSTS_PORT_CHANGE; } + + /* sof */ + if (status & USBSTS_SOF) { + REG_USBSTS = USBSTS_SOF; + sof_received(); + } } bool usb_drv_stalled(int endpoint,bool in) @@ -664,6 +679,183 @@ void usb_drv_set_test_mode(int mode) REG_USBCMD |= USBCMD_RUN; } +/* batched request api */ +static struct transfer_descriptor batch_td_array[USB_BATCH_SLOTS] USB_DEVBSS_ATTR __attribute__((aligned(32))); + +static uint8_t batch_ep = 0; +static uint8_t batch_write_cursor; +static bool batch_stopped; +static usb_drv_batch_get_more batch_get_more; + +static int ep_to_pipe_index(uint8_t ep) { + const int ep_num = EP_NUM(ep); + const int ep_dir = EP_DIR(ep); + const int pipe = ep_num * 2 + (ep_dir == DIR_IN ? 1 : 0); + return pipe; +} + +int usb_drv_batch_init(int ep, usb_drv_batch_get_more get_more) { + logf("batch init"); + if(batch_ep != 0) { + logf("batch function not available"); + return -1; + } + batch_ep = ep; + batch_get_more = get_more; + return 0; +} + +int usb_drv_batch_deinit() { + logf("batch deinit"); + usb_drv_batch_stop(); + batch_ep = 0; + return 0; +} + +/* returns whether priming is needed */ +static bool batch_fill_tds(void) { + while(!(batch_td_array[batch_write_cursor].size_ioc_sts & DTD_STATUS_ACTIVE)) { + /* batch_get_more may call batch_stop() through: + * - batch_get_more() + * - pcm_play_dma_complete_callback() + * - sink_stop() + * - usb_drv_batch_stop() */ + const void* ptr; + size_t len; + batch_get_more(&ptr, &len); + if(len == 0 || batch_stopped) { + return false; + } + + struct transfer_descriptor* td = &batch_td_array[batch_write_cursor]; + td_set_buf_ptr(td, ptr); + td->size_ioc_sts = (len << DTD_LENGTH_BIT_POS) | DTD_STATUS_ACTIVE; + batch_write_cursor = (batch_write_cursor + 1) % USB_BATCH_SLOTS; + } + return true; +} + +int usb_drv_batch_start(void) { + logf("batch start"); + + /* reset variables */ + batch_write_cursor = 0; + batch_stopped = false; + + /* chain tds */ + memset(batch_td_array, 0, sizeof(struct transfer_descriptor) * USB_BATCH_SLOTS); + for(int i = 0; i < USB_BATCH_SLOTS; i += 1) { + struct transfer_descriptor* td = &batch_td_array[i]; + td->next_td_ptr = (unsigned int)&batch_td_array[(i + 1) % USB_BATCH_SLOTS]; + } + + /* configure queue head */ + const int pipe = ep_to_pipe_index(batch_ep); + struct queue_head* const qh = &qh_array[pipe]; + + qh->curr_dtd_ptr = (unsigned int)&batch_td_array[0]; /* or error check in sof_received may read random location */ + qh->dtd.next_td_ptr = (unsigned int)&batch_td_array[0]; + qh->dtd.size_ioc_sts = 0; + + /* pull initial buffers */ + batch_fill_tds(); + + /* monitor sof */ + REG_USBINTR |= USBINTR_SOF_EN; + return 0; +} + +int usb_drv_batch_stop(void) { + batch_stopped = true; + + /* disable sof interrupt */ + REG_USBINTR &= ~USBINTR_SOF_EN; + + /* break the chain */ + /* terminating qh->dtd.next_td_ptr is not reliable */ + for(int i = 0; i < USB_BATCH_SLOTS; i += 1) { + struct transfer_descriptor* td = &batch_td_array[i]; + td->next_td_ptr = DTD_NEXT_TERMINATE; + } + + /* flush endpoint */ + const int pipe = ep_to_pipe_index(batch_ep); + const unsigned int mask = pipe2mask[pipe]; + + REG_ENDPTFLUSH = mask; + while (REG_ENDPTFLUSH & mask); + + return 0; +} + +#if defined(LOGF_ENABLE) && defined(ROCKBOX_HAS_LOGF) +void usb_drv_dump_regs(void) { + logf("==== register dump %ld ====", current_tick); + logf("USBSTS 0x%08X", REG_USBSTS); + logf("ENDPTSETUPSTAT 0x%08X", REG_ENDPTSETUPSTAT); + logf("ENDPTPRIME 0x%08X", REG_ENDPTPRIME); + logf("ENDPTFLUSH 0x%08X", REG_ENDPTFLUSH); + logf("ENDPTSTATUS 0x%08X", REG_ENDPTSTATUS); + logf("ENDPTCOMPLETE 0x%08X", REG_ENDPTCOMPLETE); + logf("ENDPTCTRL0 0x%08X", REG_ENDPTCTRL0); + logf("ENDPTCTRL1 0x%08X", REG_ENDPTCTRL1); + logf("ENDPTCTRL2 0x%08X", REG_ENDPTCTRL2); +} + +static void dump_td_array(struct queue_head* qh, struct transfer_descriptor* tds, size_t size) { + void* current = (void*)qh->curr_dtd_ptr; + void* next = (void*)qh->dtd.next_td_ptr; + + logf("==== td dump %ld n=%p c=%p ====", current_tick, next, current); + for(int i = 0; i < size; i += 1) { + int len = (tds[i].size_ioc_sts & DTD_PACKET_SIZE) >> DTD_LENGTH_BIT_POS; + char sts[] = { + &tds[i] == current ? 'c' : ' ', + &tds[i] == next ? 'n' : ' ', + i == batch_write_cursor ? 'w' : ' ', + '\0', + }; + logf("%s td[%02d] status=0x%08X len=%d", sts, i, tds[i].size_ioc_sts, len); + } +} + +void usb_drv_dump_tds(int ep) { + const int pipe = ep_to_pipe_index(ep); + struct queue_head* const qh = &qh_array[pipe]; + dump_td_array(qh, &td_array[pipe * NUM_TDS_PER_EP], NUM_TDS_PER_EP); +} + +void usb_drv_batch_dump_tds(void) { + const int pipe = ep_to_pipe_index(batch_ep); + struct queue_head* const qh = &qh_array[pipe]; + dump_td_array(qh, batch_td_array, USB_BATCH_SLOTS); +} +#endif + +static void sof_received(void) { + if(batch_ep == 0) { + /* should not happen */ + return; + } + + /* error recovery */ + const int pipe = ep_to_pipe_index(batch_ep); + const unsigned int mask = pipe2mask[pipe]; + struct queue_head* const qh = &qh_array[pipe]; + struct transfer_descriptor* const td = (void*)qh->curr_dtd_ptr; + if(td->size_ioc_sts & DTD_ERROR_MASK) { + logf("td error status=0x%08X", td->size_ioc_sts); + REG_ENDPTPRIME |= mask; + } + + /* do refill */ + if(batch_fill_tds()) { + const int pipe = ep_to_pipe_index(batch_ep); + const unsigned int mask = pipe2mask[pipe]; + REG_ENDPTPRIME |= mask; + } +} + /*-------------------------------------------------------------------------*/ /* manual: 32.14.5.2 */ @@ -854,11 +1046,7 @@ static void prepare_td(struct transfer_descriptor* td, td->next_td_ptr = DTD_NEXT_TERMINATE; td->size_ioc_sts = (len<< DTD_LENGTH_BIT_POS) | DTD_STATUS_ACTIVE | DTD_IOC; - td->buff_ptr0 = (unsigned int)ptr; - td->buff_ptr1 = ((unsigned int)ptr & 0xfffff000) + 0x1000; - td->buff_ptr2 = ((unsigned int)ptr & 0xfffff000) + 0x2000; - td->buff_ptr3 = ((unsigned int)ptr & 0xfffff000) + 0x3000; - td->buff_ptr4 = ((unsigned int)ptr & 0xfffff000) + 0x4000; + td_set_buf_ptr(td, ptr); td->reserved |= DTD_RESERVED_LENGTH_MASK & len; td->reserved |= DTD_RESERVED_IN_USE; td->reserved |= (pipe << DTD_RESERVED_PIPE_OFFSET); diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c index 9d5fa04d13..9b90fbd5ad 100644 --- a/firmware/usbstack/usb_core.c +++ b/firmware/usbstack/usb_core.c @@ -554,6 +554,64 @@ void usb_core_hotswap_event(int volume, bool inserted) } #endif + +#ifdef USB_BATCH_NON_NATIVE +static uint8_t batch_ep = 0; +static bool batch_stopped; +static usb_drv_batch_get_more batch_get_more; + +int usb_drv_batch_init(int ep, usb_drv_batch_get_more get_more) +{ + if(batch_ep != 0) { + logf("usb_core: batch api in use user=0x%02X", batch_ep); + return -1; + } + batch_ep = ep; + batch_get_more = get_more; + batch_stopped = false; + return 0; +} + +int usb_drv_batch_deinit(void) +{ + logf("usb_core: batch deinit"); + usb_drv_batch_stop(); + batch_ep = 0; + return 0; +} + +static int batch_get_and_send(void) +{ + const void* ptr; + size_t len; + batch_get_more(&ptr, &len); + if(len == 0 || batch_stopped) { + return 0; + } + return usb_drv_send_nonblocking(EP_NUM(batch_ep), (void*)ptr, len); +} + +int usb_drv_batch_start(void) +{ + logf("usb_core: batch start"); + batch_stopped = false; + return batch_get_and_send(); +} + +int usb_drv_batch_stop(void) +{ + batch_stopped = true; + return 0; +} + +static void batch_xfer_complete(void) { + if(batch_stopped) { + return; + } + batch_get_and_send(); +} +#endif + static void usb_core_set_serial_function_id(void) { int i, id = 0; @@ -1130,8 +1188,14 @@ void usb_core_bus_reset(void) /* called by usb_drv_transfer_completed() */ void usb_core_transfer_complete(int endpoint, int dir, int status, int length) { - struct usb_transfer_completion_event_data* completion_event = - &ep_data[endpoint].completion_event[EP_DIR(dir)]; +#ifdef USB_BATCH_NON_NATIVE + /* batch api */ + if(batch_ep != 0 && (endpoint | dir) == batch_ep) { + batch_xfer_complete(); + return; + } +#endif + /* Fast notification */ fast_completion_handler_t handler = ep_data[endpoint].fast_completion_handler[EP_DIR(dir)]; if(handler != NULL && handler(endpoint, dir, status, length)) @@ -1154,6 +1218,9 @@ void usb_core_transfer_complete(int endpoint, int dir, int status, int length) } #endif + struct usb_transfer_completion_event_data* completion_event = + &ep_data[endpoint].completion_event[EP_DIR(dir)]; + completion_event->endpoint = endpoint; completion_event->dir = dir; completion_event->data[0] = data0; diff --git a/tools/builds.pm b/tools/builds.pm index 1a283dd9b1..0aafee756f 100644 --- a/tools/builds.pm +++ b/tools/builds.pm @@ -782,7 +782,7 @@ sub simbuilds { 'norsk' => { 'lang' => 'norsk', 'name' => 'Norsk (Norwegian)', - 'short' => 'no', + 'short' => 'nb', 'defengine' => 'piper', 'engines' => { 'espeak' => '-vno', @@ -791,6 +791,18 @@ sub simbuilds { }, 'enabled' => 0, }, + 'norsk-nynorsk' => { + 'lang' => 'norsk-nynorsk', + 'name' => 'Nynorsk (Norwegian Nynorsk)', + 'short' => 'nn', + 'defengine' => 'piper', + 'engines' => { + 'espeak' => '-vno', + 'gtts' => '-l no', + 'piper' => 'no_NO-talesyntese-medium.onnx', + }, + 'enabled' => 1, + }, 'moldoveneste' => { 'lang' => 'moldoveneste', 'name' => 'Moldovenească (Moldavian)',