Compare commits

...

3 Commits

Author SHA1 Message Date
Rajarshee Chatterjee 49e4d78c92 chore: Update translations (#569)
* New translations strings.json (Romanian)
[ci skip]

* New translations strings.json (French)
[ci skip]

* New translations strings.json (Spanish)
[ci skip]

* New translations strings.json (Afrikaans)
[ci skip]

* New translations strings.json (Arabic)
[ci skip]

* New translations strings.json (Catalan)
[ci skip]

* New translations strings.json (Czech)
[ci skip]

* New translations strings.json (Danish)
[ci skip]

* New translations strings.json (German)
[ci skip]

* New translations strings.json (Greek)
[ci skip]

* New translations strings.json (Finnish)
[ci skip]

* New translations strings.json (Hebrew)
[ci skip]

* New translations strings.json (Hungarian)
[ci skip]

* New translations strings.json (Italian)
[ci skip]

* New translations strings.json (Japanese)
[ci skip]

* New translations strings.json (Korean)
[ci skip]

* New translations strings.json (Dutch)
[ci skip]

* New translations strings.json (Norwegian)
[ci skip]

* New translations strings.json (Polish)
[ci skip]

* New translations strings.json (Portuguese)
[ci skip]

* New translations strings.json (Russian)
[ci skip]

* New translations strings.json (Albanian)
[ci skip]

* New translations strings.json (Serbian (Cyrillic))
[ci skip]

* New translations strings.json (Swedish)
[ci skip]

* New translations strings.json (Turkish)
[ci skip]

* New translations strings.json (Ukrainian)
[ci skip]

* New translations strings.json (Chinese Simplified)
[ci skip]

* New translations strings.json (Chinese Traditional)
[ci skip]

* New translations strings.json (Vietnamese)
[ci skip]

* New translations strings.json (Portuguese, Brazilian)
[ci skip]

* New translations strings.json (Indonesian)
[ci skip]

* New translations strings.json (Hindi)
[ci skip]

* New translations strings.json (Turkish)
[ci skip]

* New translations strings.json (Vietnamese)
[ci skip]

* New translations strings.json (Portuguese, Brazilian)
[ci skip]

* New translations strings.json (German)
[ci skip]

* New translations strings.json (German)
[ci skip]

* New translations strings.json (Italian)
[ci skip]

* New translations strings.json (Russian)
[ci skip]

* New translations strings.json (Russian)
[ci skip]
2023-04-06 21:54:50 +05:30
r1di c88b2e5d2a feat: extending Volume button feature, by scroll amount (#587)
Closes #447 

* Main
Added volume button scroll amount

* Volume button scroll amount

---------

Co-authored-by: Ridi <Ridi>
2023-04-06 20:42:36 +05:30
Rider21 be2dab5b5d feat: Add New Sources (#583)
* fix

* Update ranobelib.js

* fix

* test

* fix

* fix path

* test

* added sources

* added ALL sources on novel.tl

* add tags

* Update NovelTlScraper.js

* fix
2023-03-30 13:19:00 +05:30
54 changed files with 8554 additions and 1735 deletions
@@ -8,6 +8,7 @@ import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.widget.ScrollView;
import android.view.WindowManager;
import com.facebook.react.ReactActivity;
@@ -60,7 +61,7 @@ public class MainActivity extends ReactActivity {
case KeyEvent.KEYCODE_VOLUME_UP:
if (action == KeyEvent.ACTION_DOWN) {
// volup
VolumeButtonListener.up();
VolumeButtonListener.up(VolumeButtonListener.getScrollAmount());
if (!VolumeButtonListener.prevent)
return super.dispatchKeyEvent(event);
}
@@ -68,7 +69,7 @@ public class MainActivity extends ReactActivity {
case KeyEvent.KEYCODE_VOLUME_DOWN:
if (action == KeyEvent.ACTION_DOWN) {
// voldown
VolumeButtonListener.down();
VolumeButtonListener.down(VolumeButtonListener.getScrollAmount());
if (!VolumeButtonListener.prevent)
return super.dispatchKeyEvent(event);
}
@@ -79,7 +80,6 @@ public class MainActivity extends ReactActivity {
}
return super.dispatchKeyEvent(event);
}
/**
* Returns the name of the main component registered from JavaScript.
* This is used to schedule rendering of the component.
@@ -99,4 +99,4 @@ public class MainActivity extends ReactActivity {
};
}
}
}
@@ -1,11 +1,11 @@
package com.rajarsheechatterjee.VolumeButtonListener;
import androidx.annotation.NonNull;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
@@ -27,9 +27,10 @@ public class VolumeButtonListener extends ReactContextBaseJavaModule {
public static boolean prevent = false;
public static void sendEvent(boolean up) {
public static void sendEvent(boolean up, int amount) {
if (active) {
WritableMap args = Arguments.createMap();
args.putInt("scrollAmount", amount); // add scroll amount to event data
if (up)
appContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("VolumeUp", args);
else
@@ -37,12 +38,22 @@ public class VolumeButtonListener extends ReactContextBaseJavaModule {
}
}
public static void down() {
sendEvent(false);
public static void down(int amount) {
sendEvent(false, amount);
}
public static void up() {
sendEvent(true);
public static void up(int amount) {
sendEvent(true, amount);
}
private static int scrollAmount = 100;
public static void setScrollAmount(int amount) {
scrollAmount = amount;
}
public static int getScrollAmount() {
return scrollAmount;
}
@ReactMethod
@@ -90,4 +101,14 @@ public class VolumeButtonListener extends ReactContextBaseJavaModule {
public void removeListeners(Integer count) {
// Keep: Required for RN built in Event Emitter Calls.
}
}
@ReactMethod
public void setVolumeButtonScrollAmount(int amount) {
setScrollAmount(amount);
}
@ReactMethod
public void getVolumeButtonScrollAmount(Promise promise) {
promise.resolve(getScrollAmount());
}
}
+3 -1
View File
@@ -1,3 +1,4 @@
import CookieManager from '@react-native-cookies/cookies';
import { useMMKVObject } from 'react-native-mmkv';
import { MMKVStorage } from '@utils/mmkv/mmkv';
import { showToast } from './showToast';
@@ -38,7 +39,8 @@ const useSourceStorage = ({ sourceId = -1 }: { sourceId?: number }) => {
// }),
// );
// }
CookieManager.clearAll();
CookieManager.clearAll(true); //clears cookies in webkit
setValues({});
showToast('Cookies cleared');
};
+1
View File
@@ -64,6 +64,7 @@ export const initialState = {
swipeGestures: false,
showScrollPercentage: true,
useVolumeButtons: false,
scrollAmount: 200,
showBatteryAndTime: false,
autoScroll: false,
autoScrollInterval: 10,
+6 -8
View File
@@ -88,6 +88,7 @@ const ChapterContent = ({ route, navigation }) => {
useVolumeButtons = false,
autoScroll = false,
autoScrollInterval = 10,
scrollAmount = 200,
autoScrollOffset = null,
verticalSeekbar = true,
removeExtraParagraphSpacing = false,
@@ -117,16 +118,13 @@ const ChapterContent = ({ route, navigation }) => {
VolumeButtonListener.preventDefault();
emmiter.current.addListener('VolumeUp', e => {
webViewRef.current?.injectJavaScript(`(()=>{
window.scrollBy({top:${-Dimensions.get('window')
.height},behavior:'smooth',})
})()`);
window.scrollBy({top:${-scrollAmount},behavior:'smooth',})
})()`);
});
emmiter.current.addListener('VolumeDown', e => {
webViewRef.current?.injectJavaScript(`(()=>{
window.scrollBy({top:${
Dimensions.get('window').height
},behavior:'smooth',})
})()`);
window.scrollBy({top:${scrollAmount},behavior:'smooth',})
})()`);
});
};
@@ -144,7 +142,7 @@ const ChapterContent = ({ route, navigation }) => {
emmiter.current.removeAllListeners('VolumeUp');
emmiter.current.removeAllListeners('VolumeDown');
};
}, [useVolumeButtons, chapter]);
}, [useVolumeButtons, scrollAmount]);
const onLayout = useCallback(e => {
setTimeout(() => connectVolumeButton());
@@ -1,4 +1,10 @@
import { StyleSheet, Text, useWindowDimensions, View } from 'react-native';
import {
StyleSheet,
Text,
useWindowDimensions,
View,
TextInput,
} from 'react-native';
import React, { Ref, useMemo, useState } from 'react';
import color from 'color';
@@ -6,6 +12,8 @@ import {
default as BottomSheetType,
BottomSheetView,
} from '@gorhom/bottom-sheet';
import { defaultTo } from 'lodash-es';
import BottomSheet from '@components/BottomSheet/BottomSheet';
import { useAppDispatch, useSettingsV1 } from '../../../../redux/hooks';
import { useTheme } from '@hooks/useTheme';
@@ -43,6 +51,7 @@ const GeneralTab: React.FC = () => {
showBatteryAndTime,
showScrollPercentage,
useVolumeButtons = false,
scrollAmount = 200,
swipeGestures = false,
removeExtraParagraphSpacing = false,
} = useSettingsV1();
@@ -118,10 +127,26 @@ const GeneralTab: React.FC = () => {
value={useVolumeButtons}
theme={theme}
/>
{useVolumeButtons ? (
<View style={styles.textFieldContainer}>
<Text style={[styles.paddingRightM]} numberOfLines={2}>
{getString('readerScreen.bottomSheet.scrollAmount')}
</Text>
<TextInput
style={styles.textField}
defaultValue={defaultTo(scrollAmount, 200).toString()}
keyboardType="numeric"
onChangeText={text => {
if (text) {
dispatch(setAppSettings('scrollAmount', Number(text)));
}
}}
/>
</View>
) : null}
</View>
);
};
interface ReaderBottomSheetV2Props {
bottomSheetRef: Ref<BottomSheetType> | null;
}
@@ -218,4 +243,23 @@ const styles = StyleSheet.create({
readerTab: {
paddingVertical: 8,
},
textFieldContainer: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 16,
paddingVertical: 8,
},
textField: {
borderWidth: 1,
borderRadius: 4,
paddingHorizontal: 8,
paddingVertical: 4,
width: 100,
textAlign: 'right',
},
paddingRightM: {
flex: 1,
paddingRight: 16,
},
});
@@ -7,7 +7,6 @@ import {
useWindowDimensions,
} from 'react-native';
import React, { useState } from 'react';
import { useNavigation } from '@react-navigation/native';
import { defaultTo } from 'lodash-es';
import WebView from 'react-native-webview';
@@ -69,6 +68,7 @@ const SettingsReaderScreen = () => {
const readerSettings = useReaderSettings();
const {
useVolumeButtons = false,
scrollAmount = 200,
verticalSeekbar = true,
swipeGestures = false,
autoScroll = false,
@@ -195,6 +195,28 @@ const SettingsReaderScreen = () => {
}
theme={theme}
/>
{useVolumeButtons ? (
<View style={styles.scrollAmount}>
<Text style={[labelStyle, styles.paddingRightM]} numberOfLines={2}>
{getString('readerScreen.bottomSheet.scrollAmount')}
</Text>
<TextInput
style={{
paddingHorizontal: 16,
paddingBottom: 8,
flexDirection: 'row',
}}
defaultValue={defaultTo(scrollAmount, 100).toString()}
keyboardType="numeric"
onChangeText={text => {
if (text) {
dispatch(setAppSettings('scrollAmount', Number(text)));
}
}}
/>
</View>
) : null}
<SwitchItem
label={getString('readerScreen.bottomSheet.swipeGestures')}
value={swipeGestures}
@@ -510,4 +532,11 @@ const styles = StyleSheet.create({
flex: 1,
paddingRight: 16,
},
scrollAmount: {
paddingHorizontal: 16,
paddingBottom: 8,
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
},
});
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,230 @@
import dayjs from 'dayjs';
import * as cheerio from 'cheerio';
import { htmlToText } from '../../helpers/htmlToText';
import { Status, defaultCoverUri } from '../../helpers/constants';
class NovelTlScraper {
constructor(sourceId, baseUrl, sourceName, filter) {
this.sourceId = sourceId;
this.baseUrl = baseUrl;
this.domain = baseUrl.split('//')[1];
this.sourceName = sourceName;
this.filters = filter || null;
}
async popularNovels(page, { filters }) {
const result = await fetch('https://api.novel.tl/api/site/v2/graphql', {
method: 'post',
headers: {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
'Content-Type': 'application/json',
'Alt-Used': 'api.novel.tl',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'cross-site',
},
referrer: this.baseUrl,
body: JSON.stringify({
operationName: 'Projects',
query:
'query Projects($hostname:String! $filter:SearchFilter $page:Int $limit:Int){projects(section:{fullUrl:$hostname}filter:$filter page:{pageSize:$limit,pageNumber:$page}){content{title url covers{url}}}}',
variables: {
filter: filters?.tags?.length > 0 ? { tags: filters.tags } : {},
hostname: this.domain,
limit: 40,
page,
},
}),
});
const json = await result.json();
let novels = json?.data?.projects?.content?.map(novel => ({
novelName: novel.title,
novelUrl: novel.url,
sourceId: this.sourceId,
novelCover: novel.covers[0]?.url
? this.baseUrl + novel.covers[0].url
: defaultCoverUri,
}));
return { novels };
}
async parseNovelAndChapters(novelUrl) {
const result = await fetch('https://api.novel.tl/api/site/v2/graphql', {
method: 'post',
headers: {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
'Content-Type': 'application/json',
'Alt-Used': 'api.novel.tl',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'cross-site',
},
referrer: this.baseUrl,
body: JSON.stringify({
operationName: 'Book',
query:
'query Book($url:String){project(project:{fullUrl:$url}){title translationStatus url covers{url}persons(langs:["ru","en","*"]roles:["author","illustrator","original_story","original_design"]){role name{firstName lastName}}genres{nameRu nameEng}tags{nameRu nameEng}annotation{text}subprojects{content{title volumes{content{url shortName chapters{title publishDate url published}}}}}}}',
variables: {
hostname: this.domain,
project: novelUrl,
url: this.domain + '/r/' + novelUrl,
},
}),
});
const json = await result.json();
let novel = {
sourceId: this.sourceId,
sourceName: this.sourceName,
url: this.baseUrl + '/r/' + novelUrl,
novelUrl,
novelName: json.data.project.title,
novelCover: json.data.project.covers[0]?.url
? this.baseUrl + json.data.project.covers[0].url
: defaultCoverUri,
summary: htmlToText(json.data.project.annotation?.text),
author:
json.data.project.persons[0].name.firstName +
' ' +
json.data.project.persons[0].name.lastName,
status:
json.data.project.translationStatus === 'active'
? Status.ONGOING
: Status.COMPLETED,
};
let genres = []
.concat(json.data.project.tags, json.data.project.genres)
.map(item => item?.nameRu || item?.nameEng)
.filter(item => item);
if (genres.length > 0) {
novel.genre = genres.join(',');
}
let novelChapters = [];
json.data.project.subprojects.content.forEach(work =>
work.volumes.content.forEach(volume =>
volume.chapters.forEach(
chapter =>
chapter?.published &&
novelChapters.push({
chapterName: volume.shortName + ' ' + chapter.title,
chapterUrl: volume.url + '/' + chapter.url,
releaseDate: dayjs(chapter.publishDate).format('LLL'),
}),
),
),
);
novel.chapters = novelChapters;
return novel;
}
async parseChapter(novelUrl, chapterUrl) {
const baseUrl = this.baseUrl;
const sourceId = this.sourceId;
const result = await fetch('https://api.novel.tl/api/site/v2/graphql', {
method: 'post',
headers: {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
'Content-Type': 'application/json',
'Alt-Used': 'api.novel.tl',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'cross-site',
},
referrer: baseUrl,
body: JSON.stringify({
operationName: 'EReaderData',
query:
'query EReaderData($url:String!,$chapterSelector:Selector!){project(project:{fullUrl:$url}){title url}chapter(chapter:$chapterSelector){title text{text}}}',
variables: {
chapterSelector: {
fullUrl: this.domain + '/r/' + novelUrl + '/' + chapterUrl,
},
url: this.domain + '/r/' + novelUrl + '/' + chapterUrl,
},
}),
});
const json = await result.json();
const loadedCheerio = cheerio.load(json.data.chapter.text.text);
loadedCheerio('img').each(function () {
if (!loadedCheerio(this).attr('src')?.startsWith('http')) {
let src = loadedCheerio(this).attr('src');
loadedCheerio(this).attr('src', baseUrl + src);
}
});
const chapter = {
sourceId,
novelUrl,
chapterUrl,
chapterName: json.data.chapter.title,
chapterText: loadedCheerio.html(),
};
return chapter;
}
async searchNovels(searchTerm) {
const result = await fetch('https://api.novel.tl/api/site/v2/graphql', {
method: 'post',
headers: {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
'Content-Type': 'application/json',
'Alt-Used': 'api.novel.tl',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'cross-site',
},
referrer: this.baseUrl,
body: JSON.stringify({
operationName: 'Projects',
query:
'query Projects($hostname:String! $filter:SearchFilter $page:Int $limit:Int){projects(section:{fullUrl:$hostname}filter:$filter page:{pageSize:$limit,pageNumber:$page}){content{title url covers{url}}}}',
variables: {
filter: {
query: searchTerm,
},
hostname: this.domain,
limit: 40,
page: 1,
},
}),
});
const json = await result.json();
let novels = [];
json?.data?.projects?.content?.forEach(novel =>
novels.push({
novelName: novel.title,
novelUrl: novel.url,
sourceId: this.sourceId,
novelCover: novel.covers[0]?.url
? this.baseUrl + novel.covers[0].url
: defaultCoverUri,
}),
);
return novels;
}
}
export default NovelTlScraper;
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,282 @@
import { FilterInputs } from '../../types/filterTypes';
import { htmlToText } from '../../helpers/htmlToText';
import { Status } from '../../helpers/constants';
import * as cheerio from 'cheerio';
import { defaultTo } from 'lodash-es';
class RulateScraper {
constructor(sourceId, baseUrl, sourceName, filter) {
this.sourceId = sourceId;
this.baseUrl = baseUrl;
this.sourceName = sourceName;
this.filters = [
{
key: 'sort',
label: 'Сортировка',
values: [
{ label: 'По рейтингу', value: '6' },
{ label: 'По степени готовности', value: '0' },
{ label: 'По названию на языке оригинала', value: '1' },
{ label: 'По названию на языке перевода', value: '2' },
{ label: 'По дате создания', value: '3' },
{ label: 'По дате последней активности', value: '4' },
{ label: 'По просмотрам', value: '5' },
{ label: 'По кол-ву переведённых глав', value: '7' },
{ label: 'По кол-ву лайков', value: '8' },
{ label: 'По кол-ву страниц', value: '10' },
{ label: 'По кол-ву бесплатных глав', value: '11' },
{ label: 'По кол-ву рецензий', value: '12' },
{ label: 'По кол-ву в закладках', value: '13' },
{ label: 'По кол-ву в избранном', value: '14' },
],
inputType: FilterInputs.Picker,
},
{
key: 'type',
label: 'Тип',
values: [
{ label: 'Неважно', value: '0' },
{ label: 'Только переводы', value: '1' },
{ label: 'Только авторские', value: '2' },
],
inputType: FilterInputs.Picker,
},
{
key: 'atmosphere',
label: 'Атмосфера',
values: [
{ label: 'Неважно', value: '0' },
{ label: 'Позитивная', value: '1' },
{ label: 'Dark', value: '2' },
],
inputType: FilterInputs.Picker,
},
{
key: 'trash',
label: 'Другое',
values: [
{ label: 'Готовые на 100%', value: 'ready' },
{ label: 'Доступные для перевода', value: 'tr' },
{ label: 'Доступные для скачивания', value: 'gen' },
{ label: 'Завершённые проекты', value: 'wealth' },
{ label: 'Распродажа', value: 'discount' },
{ label: 'Только онгоинги', value: 'ongoings' },
{ label: 'Убрать машинный', value: 'remove_machinelate' },
],
inputType: FilterInputs.Checkbox,
},
...filter,
{
key: 'adult',
label: 'Возрастные ограничения',
values: [
{ label: 'Все', value: '0' },
{ label: 'Убрать 18+', value: '1' },
{ label: 'Только 18+', value: '2' },
],
inputType: FilterInputs.Picker,
},
];
}
async popularNovels(page, { showLatestNovels, filters }) {
const baseUrl = this.baseUrl;
const sourceId = this.sourceId;
let url = baseUrl + '/search?t=&cat=2';
url += '&sort=' + defaultTo(filters?.sort, showLatestNovels ? '4' : '6');
url += '&type=' + defaultTo(filters?.type, '0');
url += '&atmosphere=' + defaultTo(filters?.atmosphere, '0');
url += '&adult=' + defaultTo(filters?.adult, '0');
if (filters?.genres?.length) {
url += filters.genres.map(i => `&genres[]=${i}`).join('');
}
if (filters?.tags?.length) {
url += filters.tags.map(i => `&tags[]=${i}`).join('');
}
if (filters?.trash?.length) {
url += filters.trash.map(i => `&${i}=1`);
}
url += `&Book_page=${page}`;
const result = await fetch(url);
const body = await result.text();
const loadedCheerio = cheerio.load(body);
let novels = [];
loadedCheerio(
'ul[class="search-results"] > li:not([class="ad_type_catalog"])',
).each(function () {
novels.push({
sourceId,
novelName: loadedCheerio(this).find('p > a').text(),
novelCover: baseUrl + loadedCheerio(this).find('img').attr('src'),
novelUrl: loadedCheerio(this).find('p > a').attr('href'),
});
});
return { novels };
}
async parseNovelAndChapters(novelUrl) {
let result = await fetch(this.baseUrl + novelUrl);
if (result.url.includes('mature?path=')) {
const formData = new FormData();
formData.append('path', novelUrl);
formData.append('ok', 'Да');
await fetch(result.url, {
method: 'POST',
body: formData,
});
result = await fetch(this.baseUrl + novelUrl);
}
const body = await result.text();
const loadedCheerio = cheerio.load(body);
let novel = {
sourceId: this.sourceId,
sourceName: this.sourceName,
url: this.baseUrl + novelUrl,
novelUrl,
};
novel.novelName = loadedCheerio('div[class="container"] > div > div > h1')
.text()
.trim();
novel.novelCover =
this.baseUrl + loadedCheerio('div[class="images"] > div img').attr('src');
novel.summary = loadedCheerio('#Info > div:nth-child(3)').html();
let genre = [];
if (novel?.summary) {
novel.summary = htmlToText(novel.summary);
}
loadedCheerio('div[class="span5"] > p').each(function () {
switch (loadedCheerio(this).find('strong').text()) {
case 'Автор:':
novel.author = loadedCheerio(this).find('em > a').text().trim();
break;
case 'Выпуск:':
novel.status =
loadedCheerio(this).find('em').text().trim() === 'продолжается'
? Status.ONGOING
: Status.COMPLETED;
break;
case 'Тэги:':
loadedCheerio(this)
.find('em > a')
.each(function () {
genre.push(loadedCheerio(this).text());
});
break;
case 'Жанры:':
loadedCheerio(this)
.find('em > a')
.each(function () {
genre.push(loadedCheerio(this).text());
});
break;
}
});
if (genre.length > 0) {
novel.genre = genre.reverse().join(',');
}
let chapters = [];
loadedCheerio('table > tbody > tr.chapter_row').each(function () {
const chapterName = loadedCheerio(this)
.find('td[class="t"] > a')
.text()
.trim();
const releaseDate = loadedCheerio(this)
.find('td > span')
.attr('title')
?.trim();
const chapterUrl = loadedCheerio(this)
.find('td[class="t"] > a')
.attr('href');
if (
loadedCheerio(this).find('td > span[class="disabled"]').length < 1 &&
releaseDate
) {
chapters.push({ chapterName, releaseDate, chapterUrl });
}
});
novel.chapters = chapters;
return novel;
}
async parseChapter(novelUrl, chapterUrl) {
const baseUrl = this.baseUrl;
const sourceId = this.sourceId;
let result = await fetch(baseUrl + chapterUrl);
if (result.url.includes('mature?path=')) {
const formData = new FormData();
formData.append('path', novelUrl);
formData.append('ok', 'Да');
await fetch(result.url, {
method: 'POST',
body: formData,
});
result = await fetch(baseUrl + chapterUrl);
}
const body = await result.text();
const loadedCheerio = cheerio.load(body);
loadedCheerio('.content-text img').each(function () {
if (!loadedCheerio(this).attr('src')?.startsWith('http')) {
let src = loadedCheerio(this).attr('src');
loadedCheerio(this).attr('src', baseUrl + src);
}
});
const chapterName = loadedCheerio(
'.chapter_select > select > option[selected]',
)
.text()
.trim();
const chapterText = loadedCheerio('.content-text').html();
const chapter = {
sourceId,
novelUrl,
chapterUrl,
chapterName,
chapterText,
};
return chapter;
}
async searchNovels(searchTerm) {
const result = await fetch(
this.baseUrl + '/search/autocomplete?query=' + searchTerm,
);
let json = await result.json();
let novels = [];
json.forEach(item => {
const novelName = item.title_one + ' / ' + item.title_two;
const novelCover = this.baseUrl + item.img;
const novelUrl = item.url;
novels.push({ sourceId: this.sourceId, novelName, novelCover, novelUrl });
});
return novels;
}
}
export default RulateScraper;
+2 -2
View File
@@ -9,7 +9,7 @@ const sourceName = 'Jaomix';
const baseUrl = 'https://jaomix.ru';
const popularNovels = async (page, { showLatestNovels, filters }) => {
let url = baseUrl + '/?search=&sortby=';
let url = baseUrl + '/?searchrn&sortby=';
url += defaultTo(filters?.sort, showLatestNovels ? 'upd' : 'count');
if (filters?.type?.length) {
@@ -110,7 +110,7 @@ const parseChapter = async (novelUrl, chapterUrl) => {
};
const searchNovels = async searchTerm => {
const url = `${baseUrl}/?search=${searchTerm}&but=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%BF%D0%BE+%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D1%8E&sortby=new`;
const url = `${baseUrl}/?searchrn=${searchTerm}&but=Поиск по названию&sortby=upd`;
const result = await fetch(url);
let body = await result.text();
const loadedCheerio = cheerio.load(body);
+3 -3
View File
@@ -85,8 +85,8 @@ const parseNovelAndChapters = async novelUrl => {
const chaptersRaw = await fetch(fetchChaptersUrl);
const chaptersJSON = await chaptersRaw.json();
chaptersJSON.volumes.map(volume =>
volume.chapters.map(chapter =>
chaptersJSON.volumes.forEach(volume =>
volume.chapters.forEach(chapter =>
novelChapters.push({
chapterName: chapter.name,
chapterUrl: chapter.url,
@@ -153,7 +153,7 @@ const searchNovels = async searchTerm => {
data
.find(item => item.meta.key === 'ranobe')
?.data.map(novel =>
?.data.forEach(novel =>
novels.push({
sourceId,
novelName: novel.names.rus,
+16 -12
View File
@@ -8,6 +8,7 @@ const sourceId = 93;
const sourceName = 'RanobeLib';
const baseUrl = 'https://ranobelib.me';
var ui = null;
const popularNovels = async (page, { showLatestNovels, filters }) => {
let url = `${baseUrl}/manga-list?sort=`;
@@ -46,6 +47,9 @@ const popularNovels = async (page, { showLatestNovels, filters }) => {
const body = await result.text();
const loadedCheerio = cheerio.load(body);
ui = loadedCheerio('a.header-right-menu__item')
.attr('href')
?.replace?.(/[^0-9]/g, '');
let novels = [];
@@ -122,25 +126,25 @@ const parseNovelAndChapters = async novelUrl => {
?.slice(0, -1);
chaptersJson = JSON.parse(chaptersJson);
ui = chaptersJson?.user?.id;
const novelSlug = chaptersJson.manga.slug;
chaptersJson.chapters.list.map(item => {
const chapterName =
`Том ${item.chapter_volume} Глава ${item.chapter_number} ${item.chapter_name}`?.trim();
const releaseDate = dayjs(item.chapter_created_at).format('LLL');
const chapterUrl = `${baseUrl}/${novelSlug}/v${item.chapter_volume}/c${item.chapter_number}`;
chapters.push({ chapterName, releaseDate, chapterUrl });
chaptersJson.chapters.list.forEach(chapter => {
chapters.push({
chapterName:
`Том ${chapter.chapter_volume} Глава ${chapter.chapter_number} ${chapter.chapter_name}`?.trim(),
releaseDate: dayjs(chapter.chapter_created_at).format('LLL'),
chapterUrl:
`${baseUrl}/${chaptersJson.manga.slug}/v${chapter.chapter_volume}/c${chapter.chapter_number}?bid=` +
(chapter?.branch_id || ''),
});
});
novel.chapters = chapters.reverse();
return novel;
};
const parseChapter = async (novelUrl, chapterUrl) => {
const result = await fetch(chapterUrl);
const result = await fetch(chapterUrl + (ui ? `&ui=${ui}` : ''));
const body = await result.text();
const loadedCheerio = cheerio.load(body);
@@ -179,7 +183,7 @@ const searchNovels = async searchTerm => {
const body = await result.json();
let novels = [];
body.map(novel => {
body.forEach(novel => {
const novelName = novel?.rus_name || novel.name;
const novelUrl = novel?.href || baseUrl + '/' + novel.slug;
const novelCover = novel.coverImage;
+3 -3
View File
@@ -26,7 +26,7 @@ const popularNovels = async (page, { showLatestNovels, filters }) => {
json = JSON.parse(json);
let novels = [];
json.props.pageProps.totalData.items.map(item => {
json.props.pageProps.totalData.items.forEach(item => {
const novelName = item.title;
const novelUrl = baseUrl + '/' + item.slug;
const novelCover = item?.verticalImage?.url
@@ -65,7 +65,7 @@ const parseNovelAndChapters = async novelUrl => {
let chapters = [];
json.props.pageProps.book.chapters.map(item => {
json.props.pageProps.book.chapters.forEach(item => {
const chapterName = item.title;
const releaseDate = dayjs(item.publishedAt).format('LLL');
const chapterUrl = baseUrl + item.url;
@@ -115,7 +115,7 @@ const searchNovels = async searchTerm => {
const body = await result.json();
let novels = [];
body.items.map(item => {
body.items.forEach(item => {
const novelName = item.title;
const novelUrl = baseUrl + '/' + item.slug;
const novelCover = item?.verticalImage?.url
+3 -3
View File
@@ -37,7 +37,7 @@ const popularNovels = async (page, { showLatestNovels, filters }) => {
let novels = [];
body.content.map(item => {
body.content.forEach(item => {
const novelName = item.rus_name;
const novelUrl = item.dir;
const novelCover =
@@ -89,7 +89,7 @@ const parseNovelAndChapters = async novelUrl => {
);
let volumes = await chapterResult.json();
volumes.content.map(item => {
volumes.content.forEach(item => {
const chapterName =
`Том ${item.tome} Глава ${item.chapter} ${item.name}`?.trim();
const releaseDate = dayjs(item.upload_date).format('LLL');
@@ -126,7 +126,7 @@ const searchNovels = async searchTerm => {
let body = await result.json();
let novels = [];
body.content.map(item => {
body.content.forEach(item => {
const novelName = item.rus_name;
const novelUrl = item.dir;
const novelCover =
File diff suppressed because it is too large Load Diff
+35 -1
View File
@@ -91,7 +91,6 @@ import RanobeHubScraper from './ru/ranobehub';
import RanobeLibScraper from './ru/ranobelib';
import RanobeRFScraper from './ru/ranoberf';
import RenovelsScraper from './ru/renovels';
import RulateScraper from './ru/rulate';
import FicbookScraper from './ru/ficbook';
import DivineDaoLibraryScraper from './en/divinedaolibrary';
import NovelOnlineFullScraper from './en/novelonlinefull';
@@ -135,6 +134,26 @@ import {
} from './multisrc/wqmangastream/WQMangaStreamGenerator';
import AgitoonScraper from './kr/Agitoon';
import PawReadScraper from './en/pawread';
import {
RulateScraper,
ErolateScraper,
} from './multisrc/rulate/RulateGenerator';
import {
RuRanobeScraper,
UkrRanobeScraper,
NightnovelScraper,
KgRanobeScraper,
AxelScraper,
SferdrakonScraper,
OriginalScraper,
SnailulitkaScraper,
TsundokuScraper,
JapitScraper,
BelScraper,
RedScraper,
SiScraper,
KodScraper,
} from './multisrc/noveltl/NovelTlGenerator';
interface PopularNovelsResponse {
novels: SourceNovelItem[];
@@ -288,6 +307,21 @@ export const sourceManager = (sourceId: number): Scraper => {
145: AgitoonScraper, // @ts-ignore
146: PandaMtlScraper, // @ts-ignore
147: PawReadScraper, // @ts-ignore
148: ErolateScraper, // @ts-ignore
149: RuRanobeScraper, // @ts-ignore
150: UkrRanobeScraper, // @ts-ignore
151: NightnovelScraper, // @ts-ignore
152: KgRanobeScraper, // @ts-ignore
153: AxelScraper, // @ts-ignore
154: SferdrakonScraper, // @ts-ignore
155: OriginalScraper, // @ts-ignore
156: SnailulitkaScraper, // @ts-ignore
157: TsundokuScraper, // @ts-ignore
158: JapitScraper, // @ts-ignore
159: BelScraper, // @ts-ignore
160: RedScraper, // @ts-ignore
161: SiScraper, // @ts-ignore
162: KodScraper, // @ts-ignore
};
return scrapers[sourceId];
+105
View File
@@ -880,5 +880,110 @@
"icon": "https://www.pawread.com/favicon.ico",
"url": "https://pawread.com/",
"lang": "English"
},
{
"sourceId": 148,
"sourceName": "Erolate",
"url": "https://erolate.com",
"lang": "Russian",
"icon": "https://erolate.com/i/logo/erolate.png"
},
{
"sourceId": 149,
"sourceName": "РуРанобэ",
"url": "https://ruranobe.ru",
"lang": "Russian",
"icon": "https://ruranobe.ru/logo.png"
},
{
"sourceId": 150,
"sourceName": "Переклади українською мовою",
"url": "https://ukr.novel.tl",
"lang": "Ukraine",
"icon": "https://ukr.novel.tl/logo.png"
},
{
"sourceId": 151,
"sourceName": "Nightnovel",
"url": "https://nightnovel.online",
"lang": "Russian",
"icon": "https://nightnovel.online/logo.png"
},
{
"sourceId": 152,
"sourceName": "Карманная галактика",
"url": "https://kg.novel.tl",
"lang": "Russian",
"icon": "https://kg.novel.tl/logo.png"
},
{
"sourceId": 153,
"sourceName": "Аксел",
"url": "https://axel.znovel.space",
"lang": "Russian",
"icon": "https://axel.znovel.space/logo.png"
},
{
"sourceId": 154,
"sourceName": "Уголок дракона",
"url": "https://sferdrakon.novel.tl",
"lang": "Russian",
"icon": "https://sferdrakon.novel.tl/logo.png"
},
{
"sourceId": 155,
"sourceName": "Авторские работы",
"url": "https://original.novel.tl",
"lang": "Russian",
"icon": "https://original.novel.tl/logo.png"
},
{
"sourceId": 156,
"sourceName": "Snailulitka",
"url": "https://snailulitka.novel.tl",
"lang": "Russian",
"icon": "https://snailulitka.novel.tl/logo.png"
},
{
"sourceId": 157,
"sourceName": "TsundokuTrans",
"url": "https://tsundoku.novel.tl",
"lang": "Russian",
"icon": "https://tsundoku.novel.tl/logo.png"
},
{
"sourceId": 158,
"sourceName": "Japit Comics",
"url": "https://japit.novel.tl",
"lang": "Russian",
"icon": "https://japit.novel.tl/logo.png"
},
{
"sourceId": 159,
"sourceName": "Белманга",
"url": "https://bel.novel.tl",
"lang": "Belarus",
"icon": "https://bel.novel.tl/logo.png"
},
{
"sourceId": 160,
"sourceName": "Север и Юг",
"url": "https://red.novel.tl",
"lang": "Russian",
"icon": "https://red.novel.tl/logo.png"
},
{
"sourceId": 161,
"sourceName": "Сказочные истории",
"url": "https://si.novel.tl",
"lang": "Russian",
"icon": "https://si.novel.tl/logo.png"
},
{
"sourceId": 162,
"sourceName": "K.O.D.",
"url": "https://kod.novel.tl",
"lang": "Russian",
"icon": "https://kod.novel.tl/logo.png"
}
]
+2
View File
@@ -1,5 +1,6 @@
export const languages = [
'Arabic',
'Belarus',
'Chinese',
'English',
'French',
@@ -10,5 +11,6 @@ export const languages = [
'Russian',
'Spanish',
'Turkish',
'Ukraine',
'Vietnamese',
];
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "مجموع الفصول",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "نمط العرض",
@@ -56,7 +57,8 @@
"searchbar": "البحث في التحديثات",
"lastUpdatedAt": "آخر تحديث للمكتبة:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "السجل",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+62 -59
View File
@@ -17,7 +17,7 @@
"searchResults": "Suchergebnisse",
"chapters": "Kapitel",
"submit": "Bestätigen",
"retry": "Retry"
"retry": "Erneut versuchen"
},
"library": "Bibliothek",
"libraryScreen": {
@@ -34,9 +34,10 @@
"dateAdded": "Hinzugefügt am",
"alphabetically": "Alphabetisch",
"totalChapters": "Gesamte Kapitel",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"download": "Heruntergeladen",
"unread": "Ungelesen",
"lastRead": "Zuletzt gelesen",
"lastUpdated": "Zuletzt aktualisiert"
},
"display": {
"displayMode": "Anzeigemodus",
@@ -55,8 +56,9 @@
"updatesScreen": {
"searchbar": "Nach Updates suchen",
"lastUpdatedAt": "Bibliothek zuletzt aktualisiert:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"newChapters": "Neue Kapitel",
"emptyView": "Keine kürzlichen Aktualisierungen",
"updatesLower": "Aktualisierungen"
},
"history": "Verlauf",
"historyScreen": {
@@ -93,15 +95,15 @@
"showProgressPercentage": "Zeige Fortschritt in Prozent",
"swipeGestures": "Nach links oder rechts wischen, um zwischen den Kapiteln zu wechseln",
"allowTextSelection": "Textauswahl erlauben",
"useChapterDrawerSwipeNavigation": "Swipe right to open drawer",
"removeExtraSpacing": "Remove extra paragraph spacing",
"volumeButtonsScroll": "Volume buttons scroll",
"useChapterDrawerSwipeNavigation": "Wische nach rechts, um Seitenleiste zu öffnen",
"removeExtraSpacing": "Extra Absatzabstand entfernen",
"volumeButtonsScroll": "Scrollen mit Lautstärkeregler",
"showSwipeMargins": "Show swipe margins"
},
"drawer": {
"scrollToCurrentChapter": "Scroll to current chapter",
"scrollToTop": "Scroll to top",
"scrollToBottom": "Scroll to bottom"
"scrollToCurrentChapter": "Zum aktuellen Kapitel springen",
"scrollToTop": "Zum Anfang springen",
"scrollToBottom": "Zum Ende springen"
}
},
"novelScreen": {
@@ -117,13 +119,13 @@
"display": "Darstellung"
},
"jumpToChapterModal": {
"jumpToChapter": "Jump to Chapter",
"openChapter": "Open Chapter",
"chapterName": "Chapter Name",
"chapterNumber": "Chapter Number",
"jumpToChapter": "Zum Kapitel springen",
"openChapter": "Kapitel öffnen",
"chapterName": "Kapitelname",
"chapterNumber": "Kapitelnummer",
"error": {
"validChapterName": "Enter a valid chapter name",
"validChapterNumber": "Enter a valid chapter number"
"validChapterName": "Geben Sie einen gültigen Kapitelnamen ein",
"validChapterNumber": "Geben Sie eine gültige Kapitelnummer ein"
}
}
},
@@ -133,27 +135,27 @@
"settingsScreen": {
"generalSettings": "Allgemein",
"generalSettingsScreen": {
"display": "Display",
"displayMode": "Display Mode",
"itemsPerRow": "Items per row",
"itemsPerRowLibrary": "Items per row in library",
"novelBadges": "Novel Badges",
"novelSort": "Novel Sort",
"updateLibrary": "Update library on launch",
"useFAB": "Use FAB in Library",
"novel": "Novel",
"chapterSort": "Default chapter sort",
"bySource": "By source",
"asc": "(Ascending)",
"desc": "(Descending)",
"globalUpdate": "Global update",
"updateOngoing": "Only update ongoing novels",
"refreshMetadata": "Automatically refresh metadata",
"refreshMetadataDescription": "Check for new cover and details when updating library",
"updateTime": "Show last update time",
"autoDownload": "Auto-download",
"downloadNewChapters": "Download new chapters",
"disableHapticFeedback": "Disable haptic feedback"
"display": "Darstellung",
"displayMode": "Anzeigemodus",
"itemsPerRow": "Bücher pro Reihe",
"itemsPerRowLibrary": "Bücher pro Reihe in der Bibliothek",
"novelBadges": "Bücher Markierungen",
"novelSort": "Bücher Sortierung",
"updateLibrary": "Bibliothek beim Starten aktualisieren",
"useFAB": "FAB in der Bibliothek verwenden",
"novel": "Buch",
"chapterSort": "Standard Kapitel-Sortierung",
"bySource": "Nach Quelle",
"asc": "(Aufsteigend)",
"desc": "(Absteigend)",
"globalUpdate": "Globale Aktualisierung",
"updateOngoing": "Nur laufende Bücher aktualisieren",
"refreshMetadata": "Metadaten automatisch aktualisieren",
"refreshMetadataDescription": "Suche nach neuen Cover und Details beim Aktualisieren der Bibliothek",
"updateTime": "Zeige den Zeitpunkt der letzten Aktualisierung",
"autoDownload": "Automatisch herunterladen",
"downloadNewChapters": "Neue Kapitel herunterladen",
"disableHapticFeedback": "Haptisches Feedback deaktivieren"
},
"readerSettings": {
"title": "Reader",
@@ -185,7 +187,7 @@
"statsScreen": {
"title": "Statistiken",
"titlesInLibrary": "Bücher in der Bibliothek",
"totalChapters": "Total chapters",
"totalChapters": "Gesamte Kapitel",
"readChapters": "Gelesene Kapitel",
"unreadChapters": "Ungelesene Kapitel",
"downloadedChapters": "Heruntergeladene Kapitel",
@@ -194,12 +196,12 @@
},
"globalSearch": {
"searchIn": "Suche ein Buch in",
"allSources": "all sources",
"pinnedSources": "pinned sources"
"allSources": "Alle Quellen",
"pinnedSources": "Angepinnte Quellen"
},
"advancedSettings": {
"deleteReadChapters": "Delete read chapters",
"deleteReadChaptersDialogTitle": "Are you sure? All chapters marked as read will be deleted."
"deleteReadChapters": "Gelesene Kapitel löschen",
"deleteReadChaptersDialogTitle": "Sind Sie sicher? Alle als gelesen markierten Kapitel werden gelöscht."
},
"date": {
"calendar": {
@@ -210,26 +212,27 @@
}
},
"categories": {
"addCategories": "Add category",
"editCategories": "Rename category",
"setCategories": "Set categories",
"header": "Edit categories",
"emptyMsg": "You have no categories. Tap the plus button to create one for organizing your library",
"setModalEmptyMsg": "You have no categories. Tap the Edit button to create one for organizing your library",
"addCategories": "Kategorie hinzufügen",
"editCategories": "Kategorie umbenennen",
"setCategories": "Kategorien festlegen",
"header": "Kategorien bearbeiten",
"emptyMsg": "Sie haben keine Kategorien. Tippen Sie auf die Plus-Schaltfläche, um eine für die Organisation Ihrer Bibliothek zu erstellen",
"setModalEmptyMsg": "Sie haben keine Kategorien. Tippen Sie auf die Plus-Schaltfläche, um eine für die Organisation Ihrer Bibliothek zu erstellen",
"deleteModal": {
"header": "Delete category",
"desc": "Do you wish to delete category"
"header": "Kategorie löschen",
"desc": "Möchten Sie diese Kategorie löschen?"
},
"duplicateError": "A category with this name already exists!",
"defaultCategory": "Default category"
"duplicateError": "Eine Kategorie mit diesem Namen existiert bereits!",
"defaultCategory": "Standard-Kategorie"
},
"settings": {
"icognitoMode": "Incognito mode",
"downloadedOnly": "Downloaded only"
"icognitoMode": "Inkognito-Modus",
"downloadedOnly": "Nur Downloads"
},
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"dbInfo": "Downloads werden in einer SQLite-Datenbank gespeichert.",
"downloadChapters": "Heruntergeladene Kapitel",
"noDownloads": "Keine Downloads",
"downloadsLower": "Downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+1
View File
@@ -98,6 +98,7 @@
"useChapterDrawerSwipeNavigation": "Swipe right to open drawer",
"removeExtraSpacing": "Remove extra paragraph spacing",
"volumeButtonsScroll": "Volume buttons scroll",
"scrollAmount": "Scroll amount:",
"showSwipeMargins": "Show swipe margins"
},
"drawer": {
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Capítulos totales",
"download": "Descargado",
"unread": "No leído",
"lastRead": "Último leído"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Nombre total de chapitres",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Mode d'affichage",
@@ -56,7 +57,8 @@
"searchbar": "Rechercher des mises à jour",
"lastUpdatedAt": "Dernière mise à jour de la bibliothèque :",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "Historique",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Jumlah bab",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Mode tampilan",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+51 -48
View File
@@ -3,70 +3,72 @@
"cancel": "Annulla",
"ok": "Ok",
"save": "Salva",
"clear": "Clear",
"clear": "Svuota",
"reset": "Reset",
"search": "Search",
"install": "Install",
"newUpdateAvailable": "New update available",
"categories": "Categories",
"add": "Add",
"edit": "Edit",
"name": "Name",
"searchFor": "Search for",
"globally": "globally",
"searchResults": "Search results",
"chapters": "Chapters",
"submit": "Submit",
"retry": "Retry"
"search": "Cerca",
"install": "Installa",
"newUpdateAvailable": "Nuovo aggiornamento disponibile",
"categories": "Categorie",
"add": "Aggiungi",
"edit": "Modifica",
"name": "Nome",
"searchFor": "Cerca per",
"globally": "globale",
"searchResults": "Risultati della ricerca",
"chapters": "Capitoli",
"submit": "Invia",
"retry": "Riprova"
},
"library": "Library",
"library": "Libreria",
"libraryScreen": {
"searchbar": "Search library",
"empty": "Your library is empty. Add series to your library from Browse.",
"searchbar": "Cerca nella libreria",
"empty": "La tua libreria è vuota. Aggiungi delle serie alla tua libreria da Esplora.",
"bottomSheet": {
"filters": {
"downloaded": "Downloaded",
"unread": "Unread",
"completed": "Completed",
"started": "Started"
"downloaded": "Scaricati",
"unread": "Non letti",
"completed": "Completati",
"started": "Iniziati"
},
"sortOrders": {
"dateAdded": "Date added",
"alphabetically": "Alphabetically",
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"dateAdded": "Data d'inserimento",
"alphabetically": "Ordine Alfabetico",
"totalChapters": "Capitoli totali",
"download": "Scaricati",
"unread": "Non letti",
"lastRead": "Ultima lettura",
"lastUpdated": "Ultimo aggiornamento"
},
"display": {
"displayMode": "Display mode",
"compact": "Compact grid",
"comfortable": "Comfortable grid",
"noTitle": "Cover only grid",
"list": "List",
"badges": "Badges",
"downloadBadges": "Download badges",
"unreadBadges": "Unread badges",
"showNoOfItems": "Show number of items"
"displayMode": "Modalità di visualizzazione",
"compact": "Griglia compatta",
"comfortable": "Griglia comoda",
"noTitle": "Griglia solo copertina",
"list": "Lista",
"badges": "Badge",
"downloadBadges": "Scarica il badge",
"unreadBadges": "Badge non letti",
"showNoOfItems": "Mostra il numero di elementi"
}
}
},
"updates": "Updates",
"updates": "Aggiornamenti",
"updatesScreen": {
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"searchbar": "Cerca aggiornamenti",
"lastUpdatedAt": "Aggiornamento Libreria:",
"newChapters": "Nuovi capitoli",
"emptyView": "Nessun aggiornamento recente",
"updatesLower": "aggiornamenti"
},
"history": "History",
"history": "Cronologia",
"historyScreen": {
"searchbar": "Search history",
"clearHistorWarning": "Are you sure? All history will be lost."
"searchbar": "Cerca nella cronologia",
"clearHistorWarning": "Sei sicuro? Tutta la cronologia sarà persa."
},
"browse": "Browse",
"browse": "Esplora",
"browseScreen": {
"discover": "Discover",
"searchbar": "Search sources",
"discover": "Scopri",
"searchbar": "Cerca fonti",
"globalSearch": "Global search",
"listEmpty": "Enable languages from settings",
"lastUsed": "Last used",
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "合計章数",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "表示モード",
@@ -56,7 +57,8 @@
"searchbar": "更新を検索",
"lastUpdatedAt": "ライブラリの最終更新日",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "履歴",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Totaal aantal hoofdstukken",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Weergavemodus",
@@ -56,7 +57,8 @@
"searchbar": "Updates zoeken",
"lastUpdatedAt": "Bibliotheek laatst bijgewerkt:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "Geschiedenis",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+9 -6
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total de capítulos",
"download": "Baixado",
"unread": "Não lido",
"lastRead": "Última leitura"
"lastRead": "Last read",
"lastUpdated": "Últimas atualizações"
},
"display": {
"displayMode": "Modo de exibição",
@@ -55,8 +56,9 @@
"updatesScreen": {
"searchbar": "Procurar por atualizações",
"lastUpdatedAt": "Biblioteca atualizada pela última vez:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"newChapters": "novo Capítulos",
"emptyView": "Sem atualizações recentes",
"updatesLower": "atualizações"
},
"history": "Histórico",
"historyScreen": {
@@ -228,8 +230,9 @@
"downloadedOnly": "Apenas baixados"
},
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"dbInfo": "Transferências são salvos em banco de dados SQLite.",
"downloadChapters": "Capítulos baixados",
"noDownloads": "Sem transferências",
"downloadsLower": "baixados"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+9 -6
View File
@@ -36,7 +36,8 @@
"totalChapters": "Всего глав",
"download": "Загружено",
"unread": "Непрочитанные",
"lastRead": "Последнее прочитанное"
"lastRead": "Последнее прочитанное",
"lastUpdated": "Последнее обновление"
},
"display": {
"displayMode": "Режим отображения",
@@ -55,8 +56,9 @@
"updatesScreen": {
"searchbar": "Поиск в обновлениях",
"lastUpdatedAt": "Последнее обновление библиотеки:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"newChapters": "новые главы",
"emptyView": "Нет последних обновлений",
"updatesLower": "обновлено"
},
"history": "История",
"historyScreen": {
@@ -228,8 +230,9 @@
"downloadedOnly": "Только загруженные главы"
},
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"dbInfo": "Загрузки сохраняются в базе данных SQLite.",
"downloadChapters": "загруженные главы",
"noDownloads": "Ничего не загружено",
"downloadsLower": "Загруженное"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Total chapters",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Display mode",
@@ -56,7 +57,8 @@
"searchbar": "Search updates",
"lastUpdatedAt": "Library last updated:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "History",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+9 -6
View File
@@ -36,7 +36,8 @@
"totalChapters": "Toplam bölüm",
"download": "İndirilenler",
"unread": "Okunmamışlar",
"lastRead": "Son Okunanlar"
"lastRead": "Son okunma",
"lastUpdated": "Son güncellenme"
},
"display": {
"displayMode": "Görüntüleme modu",
@@ -55,8 +56,9 @@
"updatesScreen": {
"searchbar": "Güncellemelerde ara",
"lastUpdatedAt": "Kitaplık son güncelleme:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"newChapters": "Yeni bölüm",
"emptyView": "Güncelleme yok",
"updatesLower": "güncellemeler"
},
"history": "Geçmiş",
"historyScreen": {
@@ -228,8 +230,9 @@
"downloadedOnly": "Yalnızca indirilenler"
},
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"dbInfo": "İndirilenler bir SQLite Veritabanında kaydedilmektedir.",
"downloadChapters": "İndirilen bölümler",
"noDownloads": "İndirme yok",
"downloadsLower": "İndirilenler"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "За загальною кількістю розділів",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "Режим відображення",
@@ -56,7 +57,8 @@
"searchbar": "Пошук оновлень",
"lastUpdatedAt": "Останнє оновлення бібліотеки:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "Історія",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "Toàn bộ chương",
"download": "Đã tải xuống",
"unread": "Chưa đọc",
"lastRead": "Lần đọc cuối"
"lastRead": "Lần đọc trước",
"lastUpdated": "Lân cập nhật trước"
},
"display": {
"displayMode": "Chế độ Hiển thị",
@@ -56,7 +57,8 @@
"searchbar": "Tìm kiếm bản cập nhật",
"lastUpdatedAt": "Lần cập nhật thư viện gần nhất:",
"newChapters": "chương mới",
"emptyView": "Chưa cập nhật mới"
"emptyView": "Chưa cập nhật mới",
"updatesLower": "cập nhập"
},
"history": "Lịch sử",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Các chương tải về sẽ được lưu trong cơ sở dữ liệu SQLite.",
"downloadChapters": "chương đã tải về",
"noDownloads": "Không có tải xuống"
"noDownloads": "Không có tải xuống",
"downloadsLower": "tải xuống"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "章节总数",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "显示模式",
@@ -56,7 +57,8 @@
"searchbar": "搜索更新",
"lastUpdatedAt": "最近更新的库:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "历史",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+6 -3
View File
@@ -36,7 +36,8 @@
"totalChapters": "章节总数",
"download": "Downloaded",
"unread": "Unread",
"lastRead": "Last Read"
"lastRead": "Last read",
"lastUpdated": "Last updated"
},
"display": {
"displayMode": "显示模式",
@@ -56,7 +57,8 @@
"searchbar": "搜索更新",
"lastUpdatedAt": "最近更新的库:",
"newChapters": "new Chapters",
"emptyView": "No recent updates"
"emptyView": "No recent updates",
"updatesLower": "updates"
},
"history": "历史",
"historyScreen": {
@@ -230,6 +232,7 @@
"downloadScreen": {
"dbInfo": "Downloads are saved in a SQLite Database.",
"downloadChapters": "downloaded Chapters",
"noDownloads": "No downloads"
"noDownloads": "No downloads",
"downloadsLower": "downloads"
}
}
+1
View File
@@ -82,6 +82,7 @@ export interface StringMap {
'readerScreen.bottomSheet.useChapterDrawerSwipeNavigation': 'string';
'readerScreen.bottomSheet.removeExtraSpacing': 'string';
'readerScreen.bottomSheet.volumeButtonsScroll': 'string';
'readerScreen.bottomSheet.scrollAmount': 'string';
'readerScreen.bottomSheet.showSwipeMargins': 'string';
'readerScreen.drawer.scrollToCurrentChapter': 'string';
'readerScreen.drawer.scrollToTop': 'string';