1
0
mirror of https://github.com/ru-de/faq.git synced 2024-12-22 17:01:49 +00:00
This commit is contained in:
Evgeniy Sokolov 2018-01-02 19:12:55 +01:00
parent dd56649e9b
commit 5ef8f27e0f
72 changed files with 1673 additions and 91 deletions

9
.gitignore vendored
View File

@ -1,4 +1,5 @@
# editor environment
/.idea
/*.iml
_site
.sass-cache
.jekyll-metadata
vendor
.idea

View File

@ -1,12 +0,0 @@
language: go
sudo: required
before_install:
- export GOPATH="${TRAVIS_BUILD_DIR}/Godeps/_workspace:$GOPATH"
- export PATH="${TRAVIS_BUILD_DIR}/Godeps/_workspace/bin:$PATH"
- sudo env PATH=$PATH GOPATH=$GOPATH sh files/check-install.sh
script:
- sh files/check.sh
notifications:
email: false

24
404.html Normal file
View File

@ -0,0 +1,24 @@
---
layout: default
---
<style type="text/css" media="screen">
.container {
margin: 10px auto;
max-width: 600px;
text-align: center;
}
h1 {
margin: 30px 0;
font-size: 4em;
line-height: 1;
letter-spacing: -1px;
}
</style>
<div class="container">
<h1>404</h1>
<p><strong>Page not found :(</strong></p>
<p>The requested page could not be found.</p>
</div>

View File

@ -1,34 +0,0 @@
Спасибо, что решили помочь проекту и внести свой вклад в его развитие.
Нам очень поможет, если при создании Pull Request вы будете придерживаться следующих рекомендаций:
# Какая информация приветствуется?
- Информация, которая будет отвечать на вопросы, часто возникающие у большинства вновь приехавших или собирающихся
приехать в Германию. Хорошим примером может выступать страница о [детских пособиях](https://github.com/ewgRa/de_faq/blob/master/%D0%94%D0%B5%D1%82%D1%81%D0%BA%D0%B8%D0%B5%20%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%B8%D1%8F.md). Все мы так или иначе проходим через определенный круг задач, которые надо решить до приезда, по приезду и в дальнейшем: найти работу, оформить документы, найти квартиру, купить или перевезти машину, оформить BlueCard и т.д. и т.п.
- Личный опыт, позволяющий сэкономить время и/или деньги в каких-то ситуациях, где достижение результата подвержено каким-то субъективным факторам или не имеет четко определенной процедуры. Хороший пример - получение NE, несмотря на то, что в требуемых документах указывается необходимость сертификата A1 после 33 месяцев, известны случаи получения NE и без него.
Другим хорошим примером можно считать оформление термина в Burgeramt, когда даже если ближайших терминов нет, это еще не означает, что они не появятся там через пять минут.
# Какая информация не приветствуется?
- Объемная дополнительная информация, которая уже широко представлена на других ресурсах, имеет смысл просто дать на нее ссылку и кратко описать, что там можно найти.
- Что-то очевидное и само собой разумеющееся, информация, не отвечающая на какой-то конкретный вопрос.
# Как оформить?
- Приветствуется литературный русский язык с соблюдением пунктуации, без использования сленга. Например, вместо "тачка" лучше написать "автомобиль".
- Постарайтесь избегать эмоциональных окрасок. Вместо "очередь меня взбесила", лучше написать "в это время уже была большая очередь".
- Личный опыт, представленный в виде повествования, приветствуется оформлять в виде [цитаты](https://github.com/ewgRa/de_faq/blob/master/Niederlassungserlaubnis.md#monkeyalice). Для цитирования поставьте "> " в начало строки. Текст будет выглядеть следующим образом: "> Документы почтой можно было не слать, ответ..."
# После создания Pull Request
После создания Pull Request измененные файлы будут проверены роботом на содержание орфографических ошибок и недоступные ссылки, дождитесь пожалуйста
выполнения проверок, если какой-то check не прошел, посмотрите лог, возможно где-то допущена опечатка, использовано не словарное слово, либо ссылка на какую-то страницу недоступна.
В случае если слово, на которое ругается проверка является широко употребимым, можно внести его в словарь, для этого добавьте его в файл "files/dictionary.dic".
В случае если ссылка на самом деле доступна, но отдает нестандартный ответ, можно внести такой ответ как корректный в файл "files/known_url.csv"

27
Gemfile Normal file
View File

@ -0,0 +1,27 @@
source "https://rubygems.org"
# Hello! This is where you manage which Jekyll version is used to run.
# When you want to use a different version, change it below, save the
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
#
# bundle exec jekyll serve
#
# This will help ensure the proper Jekyll version is running.
# Happy Jekylling!
gem "jekyll", "~> 3.6.2"
# This is the default theme for new Jekyll sites. You may change this to anything you like.
#gem "minima", "~> 2.0"
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
# uncomment the line below. To upgrade, run `bundle update github-pages`.
# gem "github-pages", group: :jekyll_plugins
# If you have any plugins, put them here!
group :jekyll_plugins do
# gem "jekyll-feed", "~> 0.6"
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

54
Gemfile.lock Normal file
View File

@ -0,0 +1,54 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.5.2)
public_suffix (>= 2.0.2, < 4.0)
colorator (1.1.0)
ffi (1.9.18)
forwardable-extended (2.6.0)
jekyll (3.6.2)
addressable (~> 2.4)
colorator (~> 1.0)
jekyll-sass-converter (~> 1.0)
jekyll-watch (~> 1.1)
kramdown (~> 1.14)
liquid (~> 4.0)
mercenary (~> 0.3.3)
pathutil (~> 0.9)
rouge (>= 1.7, < 3)
safe_yaml (~> 1.0)
jekyll-sass-converter (1.5.1)
sass (~> 3.4)
jekyll-watch (1.5.1)
listen (~> 3.0)
kramdown (1.16.2)
liquid (4.0.0)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
mercenary (0.3.6)
pathutil (0.16.1)
forwardable-extended (~> 2.6)
public_suffix (3.0.1)
rb-fsevent (0.10.2)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
rouge (2.2.1)
ruby_dep (1.5.0)
safe_yaml (1.0.4)
sass (3.5.4)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
PLATFORMS
ruby
DEPENDENCIES
jekyll (~> 3.6.2)
tzinfo-data
BUNDLED WITH
1.16.1

19
LICENSE
View File

@ -1,19 +0,0 @@
Copyright © 2015-2016 DE_FAQ Team
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

12
_config.yml Normal file
View File

@ -0,0 +1,12 @@
include: ['pages']
# Build settings
markdown: kramdown
kramdown:
syntax_highlighter_opts:
disable : true
plugins:
# - jekyll-feed
baseurl: /faq

View File

@ -0,0 +1,5 @@
<form action="{{ "/_pages/search.html" | relative_url }}" method="get">
<label for="search-box">Search</label>
<input type="text" id="search-box" name="query">
<input type="submit" value="search">
</form>

68
_layouts/default.html Normal file
View File

@ -0,0 +1,68 @@
<!DOCTYPE html>
<html lang="{{ page.lang | default: site.lang | default: "ru" }}">
<head>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-63204396-3');
</script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-63204396-3"></script>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<nav class="navbar navbar-default"></nav>
<nav class="navbar navbar-default navbar-fixed-top" id="navigation-panel">
<div class="container-fluid">
<ul class="nav navbar-nav">
<li><a href="{{ "/" | relative_url }}"><span class="glyphicon glyphicon-home"></span></a></li>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#"> Полезная информация о жизни в Германии
<span class="caret"></span></a>
<ul class="dropdown-menu pre-scrollable">
{% for page in site.pages %}
{% if page.url contains 'pages/' %}
<li><a href="{{ page.url | relative_url }}">{{ page.title | xml_escape }}</a></li>
{% endif %}
{% endfor %}
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li>
<form class="navbar-form navbar-left" action="{{ "/search.html" | relative_url }}" method="get">
<div class="input-group">
<input type="text" class="form-control" id="search-box" placeholder="Search" name="query">
<div class="input-group-btn">
<button class="btn btn-default" type="submit">
<i class="glyphicon glyphicon-search"></i>
</button>
</div>
</div>
</form>
</li>
<li>
<a class="navbar-brand" href="https://github.com/ru-de/faq"><svg height="24" class="octicon octicon-mark-github fill-gray-light d-inline" aria-label="github-logo" viewBox="0 0 16 16" version="1.1" width="24" role="img"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg></a>
</li>
</ul>
</div>
</nav>
<div class="container">
<main class="page-content" aria-label="Content">
<div class="wrapper">
{{ content | markdownify }}
</div>
</main>
</div>
</body>
</html>

384
assets/lunr.de.js Normal file
View File

@ -0,0 +1,384 @@
/*!
* Lunr languages, `German` language
* https://github.com/MihaiValentin/lunr-languages
*
* Copyright 2014, Mihai Valentin
* http://www.mozilla.org/MPL/
*/
/*!
* based on
* Snowball JavaScript Library v0.3
* http://code.google.com/p/urim/
* http://snowball.tartarus.org/
*
* Copyright 2010, Oleg Mazko
* http://www.mozilla.org/MPL/
*/
/**
* export the module via AMD, CommonJS or as a browser global
* Export code from https://github.com/umdjs/umd/blob/master/returnExports.js
*/
;
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(factory)
} else if (typeof exports === 'object') {
/**
* Node. Does not work with strict CommonJS, but
* only CommonJS-like environments that support module.exports,
* like Node.
*/
module.exports = factory()
} else {
// Browser globals (root is window)
factory()(root.lunr);
}
}(this, function() {
/**
* Just return a value to define the module export.
* This example returns an object, but the module
* can return a function as the exported value.
*/
return function(lunr) {
/* throw error if lunr is not yet included */
if ('undefined' === typeof lunr) {
throw new Error('Lunr is not present. Please include / require Lunr before this script.');
}
/* throw error if lunr stemmer support is not yet included */
if ('undefined' === typeof lunr.stemmerSupport) {
throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.');
}
/* register specific locale function */
lunr.de = function() {
this.pipeline.reset();
this.pipeline.add(
lunr.de.trimmer,
lunr.de.stopWordFilter,
lunr.de.stemmer
);
// for lunr version 2
// this is necessary so that every searched word is also stemmed before
// in lunr <= 1 this is not needed, as it is done using the normal pipeline
if (this.searchPipeline) {
this.searchPipeline.reset();
this.searchPipeline.add(lunr.de.stemmer)
}
};
/* lunr trimmer function */
lunr.de.wordCharacters = "A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A";
lunr.de.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.de.wordCharacters);
lunr.Pipeline.registerFunction(lunr.de.trimmer, 'trimmer-de');
/* lunr stemmer function */
lunr.de.stemmer = (function() {
/* create the wrapped stemmer object */
var Among = lunr.stemmerSupport.Among,
SnowballProgram = lunr.stemmerSupport.SnowballProgram,
st = new function GermanStemmer() {
var a_0 = [new Among("", -1, 6), new Among("U", 0, 2),
new Among("Y", 0, 1), new Among("\u00E4", 0, 3),
new Among("\u00F6", 0, 4), new Among("\u00FC", 0, 5)
],
a_1 = [
new Among("e", -1, 2), new Among("em", -1, 1),
new Among("en", -1, 2), new Among("ern", -1, 1),
new Among("er", -1, 1), new Among("s", -1, 3),
new Among("es", 5, 2)
],
a_2 = [new Among("en", -1, 1),
new Among("er", -1, 1), new Among("st", -1, 2),
new Among("est", 2, 1)
],
a_3 = [new Among("ig", -1, 1),
new Among("lich", -1, 1)
],
a_4 = [new Among("end", -1, 1),
new Among("ig", -1, 2), new Among("ung", -1, 1),
new Among("lich", -1, 3), new Among("isch", -1, 2),
new Among("ik", -1, 2), new Among("heit", -1, 3),
new Among("keit", -1, 4)
],
g_v = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 8, 0, 32, 8
],
g_s_ending = [117, 30, 5],
g_st_ending = [
117, 30, 4
],
I_x, I_p2, I_p1, sbp = new SnowballProgram();
this.setCurrent = function(word) {
sbp.setCurrent(word);
};
this.getCurrent = function() {
return sbp.getCurrent();
};
function habr1(c1, c2, v_1) {
if (sbp.eq_s(1, c1)) {
sbp.ket = sbp.cursor;
if (sbp.in_grouping(g_v, 97, 252)) {
sbp.slice_from(c2);
sbp.cursor = v_1;
return true;
}
}
return false;
}
function r_prelude() {
var v_1 = sbp.cursor,
v_2, v_3, v_4, v_5;
while (true) {
v_2 = sbp.cursor;
sbp.bra = v_2;
if (sbp.eq_s(1, "\u00DF")) {
sbp.ket = sbp.cursor;
sbp.slice_from("ss");
} else {
if (v_2 >= sbp.limit)
break;
sbp.cursor = v_2 + 1;
}
}
sbp.cursor = v_1;
while (true) {
v_3 = sbp.cursor;
while (true) {
v_4 = sbp.cursor;
if (sbp.in_grouping(g_v, 97, 252)) {
v_5 = sbp.cursor;
sbp.bra = v_5;
if (habr1("u", "U", v_4))
break;
sbp.cursor = v_5;
if (habr1("y", "Y", v_4))
break;
}
if (v_4 >= sbp.limit) {
sbp.cursor = v_3;
return;
}
sbp.cursor = v_4 + 1;
}
}
}
function habr2() {
while (!sbp.in_grouping(g_v, 97, 252)) {
if (sbp.cursor >= sbp.limit)
return true;
sbp.cursor++;
}
while (!sbp.out_grouping(g_v, 97, 252)) {
if (sbp.cursor >= sbp.limit)
return true;
sbp.cursor++;
}
return false;
}
function r_mark_regions() {
I_p1 = sbp.limit;
I_p2 = I_p1;
var c = sbp.cursor + 3;
if (0 <= c && c <= sbp.limit) {
I_x = c;
if (!habr2()) {
I_p1 = sbp.cursor;
if (I_p1 < I_x)
I_p1 = I_x;
if (!habr2())
I_p2 = sbp.cursor;
}
}
}
function r_postlude() {
var among_var, v_1;
while (true) {
v_1 = sbp.cursor;
sbp.bra = v_1;
among_var = sbp.find_among(a_0, 6);
if (!among_var)
return;
sbp.ket = sbp.cursor;
switch (among_var) {
case 1:
sbp.slice_from("y");
break;
case 2:
case 5:
sbp.slice_from("u");
break;
case 3:
sbp.slice_from("a");
break;
case 4:
sbp.slice_from("o");
break;
case 6:
if (sbp.cursor >= sbp.limit)
return;
sbp.cursor++;
break;
}
}
}
function r_R1() {
return I_p1 <= sbp.cursor;
}
function r_R2() {
return I_p2 <= sbp.cursor;
}
function r_standard_suffix() {
var among_var, v_1 = sbp.limit - sbp.cursor,
v_2, v_3, v_4;
sbp.ket = sbp.cursor;
among_var = sbp.find_among_b(a_1, 7);
if (among_var) {
sbp.bra = sbp.cursor;
if (r_R1()) {
switch (among_var) {
case 1:
sbp.slice_del();
break;
case 2:
sbp.slice_del();
sbp.ket = sbp.cursor;
if (sbp.eq_s_b(1, "s")) {
sbp.bra = sbp.cursor;
if (sbp.eq_s_b(3, "nis"))
sbp.slice_del();
}
break;
case 3:
if (sbp.in_grouping_b(g_s_ending, 98, 116))
sbp.slice_del();
break;
}
}
}
sbp.cursor = sbp.limit - v_1;
sbp.ket = sbp.cursor;
among_var = sbp.find_among_b(a_2, 4);
if (among_var) {
sbp.bra = sbp.cursor;
if (r_R1()) {
switch (among_var) {
case 1:
sbp.slice_del();
break;
case 2:
if (sbp.in_grouping_b(g_st_ending, 98, 116)) {
var c = sbp.cursor - 3;
if (sbp.limit_backward <= c && c <= sbp.limit) {
sbp.cursor = c;
sbp.slice_del();
}
}
break;
}
}
}
sbp.cursor = sbp.limit - v_1;
sbp.ket = sbp.cursor;
among_var = sbp.find_among_b(a_4, 8);
if (among_var) {
sbp.bra = sbp.cursor;
if (r_R2()) {
switch (among_var) {
case 1:
sbp.slice_del();
sbp.ket = sbp.cursor;
if (sbp.eq_s_b(2, "ig")) {
sbp.bra = sbp.cursor;
v_2 = sbp.limit - sbp.cursor;
if (!sbp.eq_s_b(1, "e")) {
sbp.cursor = sbp.limit - v_2;
if (r_R2())
sbp.slice_del();
}
}
break;
case 2:
v_3 = sbp.limit - sbp.cursor;
if (!sbp.eq_s_b(1, "e")) {
sbp.cursor = sbp.limit - v_3;
sbp.slice_del();
}
break;
case 3:
sbp.slice_del();
sbp.ket = sbp.cursor;
v_4 = sbp.limit - sbp.cursor;
if (!sbp.eq_s_b(2, "er")) {
sbp.cursor = sbp.limit - v_4;
if (!sbp.eq_s_b(2, "en"))
break;
}
sbp.bra = sbp.cursor;
if (r_R1())
sbp.slice_del();
break;
case 4:
sbp.slice_del();
sbp.ket = sbp.cursor;
among_var = sbp.find_among_b(a_3, 2);
if (among_var) {
sbp.bra = sbp.cursor;
if (r_R2() && among_var == 1)
sbp.slice_del();
}
break;
}
}
}
}
this.stem = function() {
var v_1 = sbp.cursor;
r_prelude();
sbp.cursor = v_1;
r_mark_regions();
sbp.limit_backward = v_1;
sbp.cursor = sbp.limit;
r_standard_suffix();
sbp.cursor = sbp.limit_backward;
r_postlude();
return true;
}
};
/* and return a function that stems a word for the current locale */
return function(token) {
// for lunr version 2
if (typeof token.update === "function") {
return token.update(function(word) {
st.setCurrent(word);
st.stem();
return st.getCurrent();
})
} else { // for lunr version <= 1
st.setCurrent(token);
st.stem();
return st.getCurrent();
}
}
})();
lunr.Pipeline.registerFunction(lunr.de.stemmer, 'stemmer-de');
lunr.de.stopWordFilter = lunr.generateStopWordFilter('aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über'.split(' '));
lunr.Pipeline.registerFunction(lunr.de.stopWordFilter, 'stopWordFilter-de');
};
}))

1
assets/lunr.min.js vendored Normal file

File diff suppressed because one or more lines are too long

75
assets/lunr.multi.js Normal file
View File

@ -0,0 +1,75 @@
/**
* export the module via AMD, CommonJS or as a browser global
* Export code from https://github.com/umdjs/umd/blob/master/returnExports.js
*/
;(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(factory)
} else if (typeof exports === 'object') {
/**
* Node. Does not work with strict CommonJS, but
* only CommonJS-like environments that support module.exports,
* like Node.
*/
module.exports = factory()
} else {
// Browser globals (root is window)
factory()(root.lunr);
}
}(this, function () {
/**
* Just return a value to define the module export.
* This example returns an object, but the module
* can return a function as the exported value.
*/
return function(lunr) {
/* Set up the pipeline for indexing content in multiple languages. The
corresponding lunr.{lang} files must be loaded before calling this
function; English ('en') is built in.
Returns: a lunr plugin for use in your indexer.
Known drawback: every word will be stemmed with stemmers for every
language. This could mean that sometimes words that have the same
stemming root will not be stemmed as such.
*/
lunr.multiLanguage = function(/* lang1, lang2, ... */) {
var languages = Array.prototype.slice.call(arguments);
var nameSuffix = languages.join('-');
var wordCharacters = "";
var pipeline = [];
var searchPipeline = [];
for (var i = 0; i < languages.length; ++i) {
if (languages[i] == 'en') {
wordCharacters += '\\w';
pipeline.unshift(lunr.stopWordFilter);
pipeline.push(lunr.stemmer);
searchPipeline.push(lunr.stemmer);
} else {
wordCharacters += lunr[languages[i]].wordCharacters;
pipeline.unshift(lunr[languages[i]].stopWordFilter);
pipeline.push(lunr[languages[i]].stemmer);
searchPipeline.push(lunr[languages[i]].stemmer);
}
};
var multiTrimmer = lunr.trimmerSupport.generateTrimmer(wordCharacters);
lunr.Pipeline.registerFunction(multiTrimmer, 'lunr-multi-trimmer-' + nameSuffix);
pipeline.unshift(multiTrimmer);
return function() {
this.pipeline.reset();
this.pipeline.add.apply(this.pipeline, pipeline);
// for lunr version 2
// this is necessary so that every searched word is also stemmed before
// in lunr <= 1 this is not needed, as it is done using the normal pipeline
if (this.searchPipeline) {
this.searchPipeline.reset();
this.searchPipeline.add.apply(this.searchPipeline, searchPipeline);
}
};
}
}
}));

391
assets/lunr.ru.js Normal file
View File

@ -0,0 +1,391 @@
/*!
* Lunr languages, `Russian` language
* https://github.com/MihaiValentin/lunr-languages
*
* Copyright 2014, Mihai Valentin
* http://www.mozilla.org/MPL/
*/
/*!
* based on
* Snowball JavaScript Library v0.3
* http://code.google.com/p/urim/
* http://snowball.tartarus.org/
*
* Copyright 2010, Oleg Mazko
* http://www.mozilla.org/MPL/
*/
/**
* export the module via AMD, CommonJS or as a browser global
* Export code from https://github.com/umdjs/umd/blob/master/returnExports.js
*/
;
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(factory)
} else if (typeof exports === 'object') {
/**
* Node. Does not work with strict CommonJS, but
* only CommonJS-like environments that support module.exports,
* like Node.
*/
module.exports = factory()
} else {
// Browser globals (root is window)
factory()(root.lunr);
}
}(this, function() {
/**
* Just return a value to define the module export.
* This example returns an object, but the module
* can return a function as the exported value.
*/
return function(lunr) {
/* throw error if lunr is not yet included */
if ('undefined' === typeof lunr) {
throw new Error('Lunr is not present. Please include / require Lunr before this script.');
}
/* throw error if lunr stemmer support is not yet included */
if ('undefined' === typeof lunr.stemmerSupport) {
throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.');
}
/* register specific locale function */
lunr.ru = function() {
this.pipeline.reset();
this.pipeline.add(
lunr.ru.trimmer,
lunr.ru.stopWordFilter,
lunr.ru.stemmer
);
// for lunr version 2
// this is necessary so that every searched word is also stemmed before
// in lunr <= 1 this is not needed, as it is done using the normal pipeline
if (this.searchPipeline) {
this.searchPipeline.reset();
this.searchPipeline.add(lunr.ru.stemmer)
}
};
/* lunr trimmer function */
lunr.ru.wordCharacters = "\u0400-\u0484\u0487-\u052F\u1D2B\u1D78\u2DE0-\u2DFF\uA640-\uA69F\uFE2E\uFE2F";
lunr.ru.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.ru.wordCharacters);
lunr.Pipeline.registerFunction(lunr.ru.trimmer, 'trimmer-ru');
/* lunr stemmer function */
lunr.ru.stemmer = (function() {
/* create the wrapped stemmer object */
var Among = lunr.stemmerSupport.Among,
SnowballProgram = lunr.stemmerSupport.SnowballProgram,
st = new function RussianStemmer() {
var a_0 = [new Among("\u0432", -1, 1), new Among("\u0438\u0432", 0, 2),
new Among("\u044B\u0432", 0, 2),
new Among("\u0432\u0448\u0438", -1, 1),
new Among("\u0438\u0432\u0448\u0438", 3, 2),
new Among("\u044B\u0432\u0448\u0438", 3, 2),
new Among("\u0432\u0448\u0438\u0441\u044C", -1, 1),
new Among("\u0438\u0432\u0448\u0438\u0441\u044C", 6, 2),
new Among("\u044B\u0432\u0448\u0438\u0441\u044C", 6, 2)
],
a_1 = [
new Among("\u0435\u0435", -1, 1), new Among("\u0438\u0435", -1, 1),
new Among("\u043E\u0435", -1, 1), new Among("\u044B\u0435", -1, 1),
new Among("\u0438\u043C\u0438", -1, 1),
new Among("\u044B\u043C\u0438", -1, 1),
new Among("\u0435\u0439", -1, 1), new Among("\u0438\u0439", -1, 1),
new Among("\u043E\u0439", -1, 1), new Among("\u044B\u0439", -1, 1),
new Among("\u0435\u043C", -1, 1), new Among("\u0438\u043C", -1, 1),
new Among("\u043E\u043C", -1, 1), new Among("\u044B\u043C", -1, 1),
new Among("\u0435\u0433\u043E", -1, 1),
new Among("\u043E\u0433\u043E", -1, 1),
new Among("\u0435\u043C\u0443", -1, 1),
new Among("\u043E\u043C\u0443", -1, 1),
new Among("\u0438\u0445", -1, 1), new Among("\u044B\u0445", -1, 1),
new Among("\u0435\u044E", -1, 1), new Among("\u043E\u044E", -1, 1),
new Among("\u0443\u044E", -1, 1), new Among("\u044E\u044E", -1, 1),
new Among("\u0430\u044F", -1, 1), new Among("\u044F\u044F", -1, 1)
],
a_2 = [
new Among("\u0435\u043C", -1, 1), new Among("\u043D\u043D", -1, 1),
new Among("\u0432\u0448", -1, 1),
new Among("\u0438\u0432\u0448", 2, 2),
new Among("\u044B\u0432\u0448", 2, 2), new Among("\u0449", -1, 1),
new Among("\u044E\u0449", 5, 1),
new Among("\u0443\u044E\u0449", 6, 2)
],
a_3 = [
new Among("\u0441\u044C", -1, 1), new Among("\u0441\u044F", -1, 1)
],
a_4 = [
new Among("\u043B\u0430", -1, 1),
new Among("\u0438\u043B\u0430", 0, 2),
new Among("\u044B\u043B\u0430", 0, 2),
new Among("\u043D\u0430", -1, 1),
new Among("\u0435\u043D\u0430", 3, 2),
new Among("\u0435\u0442\u0435", -1, 1),
new Among("\u0438\u0442\u0435", -1, 2),
new Among("\u0439\u0442\u0435", -1, 1),
new Among("\u0435\u0439\u0442\u0435", 7, 2),
new Among("\u0443\u0439\u0442\u0435", 7, 2),
new Among("\u043B\u0438", -1, 1),
new Among("\u0438\u043B\u0438", 10, 2),
new Among("\u044B\u043B\u0438", 10, 2), new Among("\u0439", -1, 1),
new Among("\u0435\u0439", 13, 2), new Among("\u0443\u0439", 13, 2),
new Among("\u043B", -1, 1), new Among("\u0438\u043B", 16, 2),
new Among("\u044B\u043B", 16, 2), new Among("\u0435\u043C", -1, 1),
new Among("\u0438\u043C", -1, 2), new Among("\u044B\u043C", -1, 2),
new Among("\u043D", -1, 1), new Among("\u0435\u043D", 22, 2),
new Among("\u043B\u043E", -1, 1),
new Among("\u0438\u043B\u043E", 24, 2),
new Among("\u044B\u043B\u043E", 24, 2),
new Among("\u043D\u043E", -1, 1),
new Among("\u0435\u043D\u043E", 27, 2),
new Among("\u043D\u043D\u043E", 27, 1),
new Among("\u0435\u0442", -1, 1),
new Among("\u0443\u0435\u0442", 30, 2),
new Among("\u0438\u0442", -1, 2), new Among("\u044B\u0442", -1, 2),
new Among("\u044E\u0442", -1, 1),
new Among("\u0443\u044E\u0442", 34, 2),
new Among("\u044F\u0442", -1, 2), new Among("\u043D\u044B", -1, 1),
new Among("\u0435\u043D\u044B", 37, 2),
new Among("\u0442\u044C", -1, 1),
new Among("\u0438\u0442\u044C", 39, 2),
new Among("\u044B\u0442\u044C", 39, 2),
new Among("\u0435\u0448\u044C", -1, 1),
new Among("\u0438\u0448\u044C", -1, 2), new Among("\u044E", -1, 2),
new Among("\u0443\u044E", 44, 2)
],
a_5 = [
new Among("\u0430", -1, 1), new Among("\u0435\u0432", -1, 1),
new Among("\u043E\u0432", -1, 1), new Among("\u0435", -1, 1),
new Among("\u0438\u0435", 3, 1), new Among("\u044C\u0435", 3, 1),
new Among("\u0438", -1, 1), new Among("\u0435\u0438", 6, 1),
new Among("\u0438\u0438", 6, 1),
new Among("\u0430\u043C\u0438", 6, 1),
new Among("\u044F\u043C\u0438", 6, 1),
new Among("\u0438\u044F\u043C\u0438", 10, 1),
new Among("\u0439", -1, 1), new Among("\u0435\u0439", 12, 1),
new Among("\u0438\u0435\u0439", 13, 1),
new Among("\u0438\u0439", 12, 1), new Among("\u043E\u0439", 12, 1),
new Among("\u0430\u043C", -1, 1), new Among("\u0435\u043C", -1, 1),
new Among("\u0438\u0435\u043C", 18, 1),
new Among("\u043E\u043C", -1, 1), new Among("\u044F\u043C", -1, 1),
new Among("\u0438\u044F\u043C", 21, 1), new Among("\u043E", -1, 1),
new Among("\u0443", -1, 1), new Among("\u0430\u0445", -1, 1),
new Among("\u044F\u0445", -1, 1),
new Among("\u0438\u044F\u0445", 26, 1), new Among("\u044B", -1, 1),
new Among("\u044C", -1, 1), new Among("\u044E", -1, 1),
new Among("\u0438\u044E", 30, 1), new Among("\u044C\u044E", 30, 1),
new Among("\u044F", -1, 1), new Among("\u0438\u044F", 33, 1),
new Among("\u044C\u044F", 33, 1)
],
a_6 = [
new Among("\u043E\u0441\u0442", -1, 1),
new Among("\u043E\u0441\u0442\u044C", -1, 1)
],
a_7 = [
new Among("\u0435\u0439\u0448\u0435", -1, 1),
new Among("\u043D", -1, 2), new Among("\u0435\u0439\u0448", -1, 1),
new Among("\u044C", -1, 3)
],
g_v = [33, 65, 8, 232],
I_p2, I_pV, sbp = new SnowballProgram();
this.setCurrent = function(word) {
sbp.setCurrent(word);
};
this.getCurrent = function() {
return sbp.getCurrent();
};
function habr3() {
while (!sbp.in_grouping(g_v, 1072, 1103)) {
if (sbp.cursor >= sbp.limit)
return false;
sbp.cursor++;
}
return true;
}
function habr4() {
while (!sbp.out_grouping(g_v, 1072, 1103)) {
if (sbp.cursor >= sbp.limit)
return false;
sbp.cursor++;
}
return true;
}
function r_mark_regions() {
I_pV = sbp.limit;
I_p2 = I_pV;
if (habr3()) {
I_pV = sbp.cursor;
if (habr4())
if (habr3())
if (habr4())
I_p2 = sbp.cursor;
}
}
function r_R2() {
return I_p2 <= sbp.cursor;
}
function habr2(a, n) {
var among_var, v_1;
sbp.ket = sbp.cursor;
among_var = sbp.find_among_b(a, n);
if (among_var) {
sbp.bra = sbp.cursor;
switch (among_var) {
case 1:
v_1 = sbp.limit - sbp.cursor;
if (!sbp.eq_s_b(1, "\u0430")) {
sbp.cursor = sbp.limit - v_1;
if (!sbp.eq_s_b(1, "\u044F"))
return false;
}
case 2:
sbp.slice_del();
break;
}
return true;
}
return false;
}
function r_perfective_gerund() {
return habr2(a_0, 9);
}
function habr1(a, n) {
var among_var;
sbp.ket = sbp.cursor;
among_var = sbp.find_among_b(a, n);
if (among_var) {
sbp.bra = sbp.cursor;
if (among_var == 1)
sbp.slice_del();
return true;
}
return false;
}
function r_adjective() {
return habr1(a_1, 26);
}
function r_adjectival() {
var among_var;
if (r_adjective()) {
habr2(a_2, 8);
return true;
}
return false;
}
function r_reflexive() {
return habr1(a_3, 2);
}
function r_verb() {
return habr2(a_4, 46);
}
function r_noun() {
habr1(a_5, 36);
}
function r_derivational() {
var among_var;
sbp.ket = sbp.cursor;
among_var = sbp.find_among_b(a_6, 2);
if (among_var) {
sbp.bra = sbp.cursor;
if (r_R2() && among_var == 1)
sbp.slice_del();
}
}
function r_tidy_up() {
var among_var;
sbp.ket = sbp.cursor;
among_var = sbp.find_among_b(a_7, 4);
if (among_var) {
sbp.bra = sbp.cursor;
switch (among_var) {
case 1:
sbp.slice_del();
sbp.ket = sbp.cursor;
if (!sbp.eq_s_b(1, "\u043D"))
break;
sbp.bra = sbp.cursor;
case 2:
if (!sbp.eq_s_b(1, "\u043D"))
break;
case 3:
sbp.slice_del();
break;
}
}
}
this.stem = function() {
r_mark_regions();
sbp.cursor = sbp.limit;
if (sbp.cursor < I_pV)
return false;
sbp.limit_backward = I_pV;
if (!r_perfective_gerund()) {
sbp.cursor = sbp.limit;
if (!r_reflexive())
sbp.cursor = sbp.limit;
if (!r_adjectival()) {
sbp.cursor = sbp.limit;
if (!r_verb()) {
sbp.cursor = sbp.limit;
r_noun();
}
}
}
sbp.cursor = sbp.limit;
sbp.ket = sbp.cursor;
if (sbp.eq_s_b(1, "\u0438")) {
sbp.bra = sbp.cursor;
sbp.slice_del();
} else
sbp.cursor = sbp.limit;
r_derivational();
sbp.cursor = sbp.limit;
r_tidy_up();
return true;
}
};
/* and return a function that stems a word for the current locale */
return function(token) {
// for lunr version 2
if (typeof token.update === "function") {
return token.update(function(word) {
st.setCurrent(word);
st.stem();
return st.getCurrent();
})
} else { // for lunr version <= 1
st.setCurrent(token);
st.stem();
return st.getCurrent();
}
}
})();
lunr.Pipeline.registerFunction(lunr.ru.stemmer, 'stemmer-ru');
lunr.ru.stopWordFilter = lunr.generateStopWordFilter('алло без близко более больше будем будет будете будешь будто буду будут будь бы бывает бывь был была были было быть в важная важное важные важный вам вами вас ваш ваша ваше ваши вверх вдали вдруг ведь везде весь вниз внизу во вокруг вон восемнадцатый восемнадцать восемь восьмой вот впрочем времени время все всегда всего всем всеми всему всех всею всю всюду вся всё второй вы г где говорил говорит год года году да давно даже далеко дальше даром два двадцатый двадцать две двенадцатый двенадцать двух девятнадцатый девятнадцать девятый девять действительно дел день десятый десять для до довольно долго должно другая другие других друго другое другой е его ее ей ему если есть еще ещё ею её ж же жизнь за занят занята занято заняты затем зато зачем здесь значит и из или им именно иметь ими имя иногда их к каждая каждое каждые каждый кажется как какая какой кем когда кого ком кому конечно которая которого которой которые который которых кроме кругом кто куда лет ли лишь лучше люди м мало между меля менее меньше меня миллионов мимо мира мне много многочисленная многочисленное многочисленные многочисленный мной мною мог могут мож может можно можхо мои мой мор мочь моя моё мы на наверху над надо назад наиболее наконец нам нами нас начала наш наша наше наши не него недавно недалеко нее ней нельзя нем немного нему непрерывно нередко несколько нет нею неё ни нибудь ниже низко никогда никуда ними них ничего но ну нужно нх о об оба обычно один одиннадцатый одиннадцать однажды однако одного одной около он она они оно опять особенно от отовсюду отсюда очень первый перед по под пожалуйста позже пока пор пора после посреди потом потому почему почти прекрасно при про просто против процентов пятнадцатый пятнадцать пятый пять раз разве рано раньше рядом с сам сама сами самим самими самих само самого самой самом самому саму свое своего своей свои своих свою сеаой себе себя сегодня седьмой сейчас семнадцатый семнадцать семь сих сказал сказала сказать сколько слишком сначала снова со собой собою совсем спасибо стал суть т та так такая также такие такое такой там твой твоя твоё те тебе тебя тем теми теперь тех то тобой тобою тогда того тоже только том тому тот тою третий три тринадцатый тринадцать ту туда тут ты тысяч у уж уже уметь хорошо хотеть хоть хотя хочешь часто чаще чего человек чем чему через четвертый четыре четырнадцатый четырнадцать что чтоб чтобы чуть шестнадцатый шестнадцать шестой шесть эта эти этим этими этих это этого этой этом этому этот эту я а'.split(' '));
lunr.Pipeline.registerFunction(lunr.ru.stopWordFilter, 'stopWordFilter-ru');
};
}))

View File

@ -0,0 +1,304 @@
/*!
* Snowball JavaScript Library v0.3
* http://code.google.com/p/urim/
* http://snowball.tartarus.org/
*
* Copyright 2010, Oleg Mazko
* http://www.mozilla.org/MPL/
*/
/**
* export the module via AMD, CommonJS or as a browser global
* Export code from https://github.com/umdjs/umd/blob/master/returnExports.js
*/
;(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(factory)
} else if (typeof exports === 'object') {
/**
* Node. Does not work with strict CommonJS, but
* only CommonJS-like environments that support module.exports,
* like Node.
*/
module.exports = factory()
} else {
// Browser globals (root is window)
factory()(root.lunr);
}
}(this, function () {
/**
* Just return a value to define the module export.
* This example returns an object, but the module
* can return a function as the exported value.
*/
return function(lunr) {
/* provides utilities for the included stemmers */
lunr.stemmerSupport = {
Among: function(s, substring_i, result, method) {
this.toCharArray = function(s) {
var sLength = s.length, charArr = new Array(sLength);
for (var i = 0; i < sLength; i++)
charArr[i] = s.charCodeAt(i);
return charArr;
};
if ((!s && s != "") || (!substring_i && (substring_i != 0)) || !result)
throw ("Bad Among initialisation: s:" + s + ", substring_i: "
+ substring_i + ", result: " + result);
this.s_size = s.length;
this.s = this.toCharArray(s);
this.substring_i = substring_i;
this.result = result;
this.method = method;
},
SnowballProgram: function() {
var current;
return {
bra : 0,
ket : 0,
limit : 0,
cursor : 0,
limit_backward : 0,
setCurrent : function(word) {
current = word;
this.cursor = 0;
this.limit = word.length;
this.limit_backward = 0;
this.bra = this.cursor;
this.ket = this.limit;
},
getCurrent : function() {
var result = current;
current = null;
return result;
},
in_grouping : function(s, min, max) {
if (this.cursor < this.limit) {
var ch = current.charCodeAt(this.cursor);
if (ch <= max && ch >= min) {
ch -= min;
if (s[ch >> 3] & (0X1 << (ch & 0X7))) {
this.cursor++;
return true;
}
}
}
return false;
},
in_grouping_b : function(s, min, max) {
if (this.cursor > this.limit_backward) {
var ch = current.charCodeAt(this.cursor - 1);
if (ch <= max && ch >= min) {
ch -= min;
if (s[ch >> 3] & (0X1 << (ch & 0X7))) {
this.cursor--;
return true;
}
}
}
return false;
},
out_grouping : function(s, min, max) {
if (this.cursor < this.limit) {
var ch = current.charCodeAt(this.cursor);
if (ch > max || ch < min) {
this.cursor++;
return true;
}
ch -= min;
if (!(s[ch >> 3] & (0X1 << (ch & 0X7)))) {
this.cursor++;
return true;
}
}
return false;
},
out_grouping_b : function(s, min, max) {
if (this.cursor > this.limit_backward) {
var ch = current.charCodeAt(this.cursor - 1);
if (ch > max || ch < min) {
this.cursor--;
return true;
}
ch -= min;
if (!(s[ch >> 3] & (0X1 << (ch & 0X7)))) {
this.cursor--;
return true;
}
}
return false;
},
eq_s : function(s_size, s) {
if (this.limit - this.cursor < s_size)
return false;
for (var i = 0; i < s_size; i++)
if (current.charCodeAt(this.cursor + i) != s.charCodeAt(i))
return false;
this.cursor += s_size;
return true;
},
eq_s_b : function(s_size, s) {
if (this.cursor - this.limit_backward < s_size)
return false;
for (var i = 0; i < s_size; i++)
if (current.charCodeAt(this.cursor - s_size + i) != s
.charCodeAt(i))
return false;
this.cursor -= s_size;
return true;
},
find_among : function(v, v_size) {
var i = 0, j = v_size, c = this.cursor, l = this.limit, common_i = 0, common_j = 0, first_key_inspected = false;
while (true) {
var k = i + ((j - i) >> 1), diff = 0, common = common_i < common_j
? common_i
: common_j, w = v[k];
for (var i2 = common; i2 < w.s_size; i2++) {
if (c + common == l) {
diff = -1;
break;
}
diff = current.charCodeAt(c + common) - w.s[i2];
if (diff)
break;
common++;
}
if (diff < 0) {
j = k;
common_j = common;
} else {
i = k;
common_i = common;
}
if (j - i <= 1) {
if (i > 0 || j == i || first_key_inspected)
break;
first_key_inspected = true;
}
}
while (true) {
var w = v[i];
if (common_i >= w.s_size) {
this.cursor = c + w.s_size;
if (!w.method)
return w.result;
var res = w.method();
this.cursor = c + w.s_size;
if (res)
return w.result;
}
i = w.substring_i;
if (i < 0)
return 0;
}
},
find_among_b : function(v, v_size) {
var i = 0, j = v_size, c = this.cursor, lb = this.limit_backward, common_i = 0, common_j = 0, first_key_inspected = false;
while (true) {
var k = i + ((j - i) >> 1), diff = 0, common = common_i < common_j
? common_i
: common_j, w = v[k];
for (var i2 = w.s_size - 1 - common; i2 >= 0; i2--) {
if (c - common == lb) {
diff = -1;
break;
}
diff = current.charCodeAt(c - 1 - common) - w.s[i2];
if (diff)
break;
common++;
}
if (diff < 0) {
j = k;
common_j = common;
} else {
i = k;
common_i = common;
}
if (j - i <= 1) {
if (i > 0 || j == i || first_key_inspected)
break;
first_key_inspected = true;
}
}
while (true) {
var w = v[i];
if (common_i >= w.s_size) {
this.cursor = c - w.s_size;
if (!w.method)
return w.result;
var res = w.method();
this.cursor = c - w.s_size;
if (res)
return w.result;
}
i = w.substring_i;
if (i < 0)
return 0;
}
},
replace_s : function(c_bra, c_ket, s) {
var adjustment = s.length - (c_ket - c_bra), left = current
.substring(0, c_bra), right = current.substring(c_ket);
current = left + s + right;
this.limit += adjustment;
if (this.cursor >= c_ket)
this.cursor += adjustment;
else if (this.cursor > c_bra)
this.cursor = c_bra;
return adjustment;
},
slice_check : function() {
if (this.bra < 0 || this.bra > this.ket || this.ket > this.limit
|| this.limit > current.length)
throw ("faulty slice operation");
},
slice_from : function(s) {
this.slice_check();
this.replace_s(this.bra, this.ket, s);
},
slice_del : function() {
this.slice_from("");
},
insert : function(c_bra, c_ket, s) {
var adjustment = this.replace_s(c_bra, c_ket, s);
if (c_bra <= this.bra)
this.bra += adjustment;
if (c_bra <= this.ket)
this.ket += adjustment;
},
slice_to : function() {
this.slice_check();
return current.substring(this.bra, this.ket);
},
eq_v_b : function(s) {
return this.eq_s_b(s.length, s);
}
};
}
};
lunr.trimmerSupport = {
generateTrimmer: function(wordCharacters) {
var startRegex = new RegExp("^[^" + wordCharacters + "]+")
var endRegex = new RegExp("[^" + wordCharacters + "]+$")
return function(token) {
// for lunr version 2
if (typeof token.update === "function") {
return token.update(function (s) {
return s
.replace(startRegex, '')
.replace(endRegex, '');
})
} else { // for lunr version 1
return token
.replace(startRegex, '')
.replace(endRegex, '');
}
};
}
}
}
}));

5
assets/require.js Normal file

File diff suppressed because one or more lines are too long

72
assets/search.js Normal file
View File

@ -0,0 +1,72 @@
(function() {
function displaySearchResults(results, store) {
var searchResults = document.getElementById('search-results');
if (results.length) { // Are there any results?
var appendString = '';
for (var i = 0; i < results.length; i++) { // Iterate over the results
var item = store[results[i].ref];
appendString += '<a href="' + item.url + '"><h3>' + item.title + '</h3></a>';
appendString += '<p>' + item.content.substring(0, 150) + '...</p><br />';
}
searchResults.innerHTML = appendString;
} else {
searchResults.innerHTML = '<li>По вашему запросу ничего не найдено</li>';
}
}
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split('&');
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split('=');
if (pair[0] === variable) {
return decodeURIComponent(pair[1].replace(/\+/g, '%20'));
}
}
}
var searchTerm = getQueryVariable('query');
if (searchTerm) {
document.getElementById('search-box').setAttribute("value", searchTerm);
// Initalize lunr with the fields it will be searching on. I've given title
// a boost of 10 to indicate matches on this field are more important.
require([assetsUrl+'/lunr.min.js', assetsUrl+'/lunr.stemmer.support.js', assetsUrl+'/lunr.de.js', assetsUrl+'/lunr.ru.js', assetsUrl+'/lunr.multi.js'], function(lunr, stemmerSupport, de, ru, multiLanguage) {
stemmerSupport(lunr);
de(lunr);
ru(lunr);
multiLanguage(lunr)
var idx = lunr(function () {
this.field('id');
this.field('title');
this.field('author');
this.field('category');
this.field('content');
this.use(lunr.multiLanguage('en', 'de', 'ru'));
for (var key in window.store) { // Add the data to lunr
this.add({
'id': key,
'title': window.store[key].title,
'author': window.store[key].author,
'category': window.store[key].category,
'content': window.store[key].content
});
}
});
var results = idx.search(searchTerm); // Get lunr to perform a search
displaySearchResults(results, window.store); // We'll write this in the next section
})
}
})();

13
docker-compose.yml Normal file
View File

@ -0,0 +1,13 @@
version: "3"
services:
site:
command: jekyll serve
image: jekyll/jekyll:latest
volumes:
- $PWD:/srv/jekyll
- $PWD/vendor/bundle:/usr/local/bundle
ports:
- 4000:4000
- 35729:35729
- 3000:3000
- 80:4000

View File

@ -1,17 +1,18 @@
# ![#f03c15](https://placehold.it/15/f03c15/000000?text=+) Данный faq переехал на https://github.com/ru-de/faq
Пожалуйста, все новые issue и pull request открывайте на новом месте. Если вы зашли сюда по ссылке со стороннего ресурса - попросите изменить ссылку, или напишите комментарий, что актуальный адрес изменился. Подробнее о переезде и его причинах можно почитать [тут](https://github.com/ewgRa/de_faq/issues/323).
---
# You don't need to edit this file, it's empty on purpose.
# Edit theme's home layout instead if you wanna make some changes
# See: https://jekyllrb.com/docs/themes/#overriding-theme-defaults
layout: default
---
# Жизнь в Берлине и Германии
В этом репозитории собрана полезная информация о жизни в Берлине, а также в целом в Германии: руководства, советы, ответы на часто задаваемые вопросы. Основная первоначальная аудитория: айтишники (программисты, sysops и т.д.), переехавшие в Берлин работать по программе Blue Card из Украины, России и других стран.
Вы очень поможете, если поделитесь своим ценным и полезным опытом, исправите устаревшую информацию или сообщите о ней. Это можно сделать прямо в интерфейсе GitHub: вверху каждой страницы есть кнопка редактирования (иконка выглядит как карандаш). При нажатии на неё автоматически создаётся ваш личный клон этого репозитория. Дальше вы можете редактировать файлы в вашем клоне. Когда готово — отправляете pull request в головной репозиторий. Всё делается прямо на сайте, консоль или другие программы использовать не требуется.
Сайт-зеркало: https://ru-de.github.io/faq/
# Авторские права и отказ от ответственности
Материалы этого репозитория создаются и редактируются различными людьми на добровольной основе. Их использование и распространение разрешается на условиях [лицензионных соглашений](LICENSE). Если вы вносите изменения в репозиторий, вы соглашаетесь с тем, что лицензионные соглашения с этого момента распространяются на материалы с вашими изменениями, и подтверждаете, что имеете все необходимые права и разрешения на предоставление такого согласия.
Материалы этого репозитория создаются и редактируются различными людьми на добровольной основе. Их использование и распространение разрешается на условиях [лицензионных соглашений](https://github.com/ru-de/faq/blob/master/LICENSE). Если вы вносите изменения в репозиторий, вы соглашаетесь с тем, что лицензионные соглашения с этого момента распространяются на материалы с вашими изменениями, и подтверждаете, что имеете все необходимые права и разрешения на предоставление такого согласия.
Материалы этого репозитория представляют собой собрание знаний и представлений, накопленных различными людьми. Авторы материалов не несут ответственность за достоверность, точность или актуальность изложенных сведений. Материалы могут содержать неточности и ошибки. Материалы предоставляются безо всяких и любых гарантий. Материалы не могут рассматриваться как юридическая, медицинская, налоговая или иная консультация.

View File

@ -1,3 +1,8 @@
---
title: Niederlassungserlaubnis
layout: default
---
## Что такое Niederlassungserlaubnis?
Niederlassungserlaubnis является разрешением, позволяющим иностранцам из стран, не входящих в ЕС, свободно жить и работать в Германии. Это также называется unbefristete Aufenthaltserlaubnis — неограниченным видом на жительство. Работа и проживание в евросоюзе за пределами Германии не разрешается.

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 158 B

After

Width:  |  Height:  |  Size: 158 B

View File

Before

Width:  |  Height:  |  Size: 223 B

After

Width:  |  Height:  |  Size: 223 B

View File

Before

Width:  |  Height:  |  Size: 748 B

After

Width:  |  Height:  |  Size: 748 B

View File

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

@ -1,5 +1,5 @@
302,https://github.com/ewgRa/de_faq/blob/master/files/Einladung%20(short%20term).docx?raw=true
302,https://github.com/ewgRa/de_faq/blob/master/files/Einladung%20(long%20term).docx?raw=true
302,https://github.com/ru-de/faq/blob/master/files/Einladung%20(short%20term).docx?raw=true
302,https://github.com/ru-de/faq/blob/master/files/Einladung%20(long%20term).docx?raw=true
000,https://www.envivas.de/de/tarife-und-service/zusatzversicherungen/auslandsreise/travelxl
000,https://www.envivas.de/de/tarife-und-service/zusatzversicherungen/auslandsreise/travelxf
000,https://www.envivas.de/
1 302 https://github.com/ewgRa/de_faq/blob/master/files/Einladung%20(short%20term).docx?raw=true https://github.com/ru-de/faq/blob/master/files/Einladung%20(short%20term).docx?raw=true
2 302 https://github.com/ewgRa/de_faq/blob/master/files/Einladung%20(long%20term).docx?raw=true https://github.com/ru-de/faq/blob/master/files/Einladung%20(long%20term).docx?raw=true
3 000 https://www.envivas.de/de/tarife-und-service/zusatzversicherungen/auslandsreise/travelxl https://www.envivas.de/de/tarife-und-service/zusatzversicherungen/auslandsreise/travelxl
4 000 https://www.envivas.de/de/tarife-und-service/zusatzversicherungen/auslandsreise/travelxf https://www.envivas.de/de/tarife-und-service/zusatzversicherungen/auslandsreise/travelxf
5 000 https://www.envivas.de/ https://www.envivas.de/

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 156 B

After

Width:  |  Height:  |  Size: 156 B

View File

Before

Width:  |  Height:  |  Size: 338 B

After

Width:  |  Height:  |  Size: 338 B

View File

@ -1,3 +1,8 @@
---
title: misc
layout: default
---
# Разное
* Сервис, который облегчает расторжение договоров: https://www.aboalarm.de

View File

@ -1,3 +1,8 @@
---
title: АБХ
layout: default
---
## АБХ ([Ausländerbehörde](http://www.berlin.de/labo/auslaender/dienstleistungen/))
Внимание! адрес офиса, для держателей Blaue Karte изменился, теперь надо ходить по адресу: Keplerstr. 2, 10589 Berlin, 4 этаж
@ -19,7 +24,7 @@
- TIP: фотографии можно сделать в самом АБХ, ищите фотоавтоматы.
- TIP: если есть подозрение, что вам будут менять карту - возьмите фотки.
- TIP: замену карту лучше проводить не во время смены работы, либо берите с собой рабочие договора, чтобы подтвердить, что вы трудоустроены, в АБХ может иметься информация, что вы безработный, и соответственно могут быть нюансы со сменой карты.
- Если жена собирается изучать язык, очень рекомендуется попросить направление на [интеграционные курсы](https://github.com/ewgRa/de_faq/blob/master/%D0%AF%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2%D1%8B%D0%B5%20%D0%BA%D1%83%D1%80%D1%81%D1%8B.md#Интеграционные-курсы-языковые-курсы)
- Если жена собирается изучать язык, очень рекомендуется попросить направление на [интеграционные курсы](https://github.com/ru-de/faq/blob/master/%D0%AF%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2%D1%8B%D0%B5%20%D0%BA%D1%83%D1%80%D1%81%D1%8B.md#Интеграционные-курсы-языковые-курсы)
## Неограниченный ВНЖ
Можно получить после 21 месяца при предоставлении сертификата владения языком B1, либо после 33 месяцев при предоставлении сертификата A1.

View File

@ -1,3 +1,8 @@
---
title: Авто
layout: default
---
# Автомобиль и все, что с этим связано
@ -63,7 +68,7 @@ A: В зависимости от страны, скорее всего ваши
#### Возврат национальных прав
Но бывает, что сотрудник Fahrerlaubnisbehörde начинает утверждать, что права не возвращаются. Способа, как ему доказать, что он не прав, до сего дня никто не обнаружил (разве что идти к другому сотруднику). Рекомендуется сделать копию, пригодится в дальнейшем для проката авто.
Если вам не удалось убедить не забирать насовсем национальные права, то стоит написать [письмо в свободной форме](https://github.com/ewgRa/de_faq/blob/master/files/DrivingLicenseReturnTemplate.md) с просьбой вернуть.
Если вам не удалось убедить не забирать насовсем национальные права, то стоит написать [письмо в свободной форме](https://github.com/ru-de/faq/blob/master/files/DrivingLicenseReturnTemplate.md) с просьбой вернуть.
### Теория

View File

@ -1,3 +1,8 @@
---
title: Велосипеды
layout: default
---
## Велосипеды
### Городские велосипедные общества

View File

@ -1,3 +1,8 @@
---
title: Виза
layout: default
---
# Получение национальной визы

View File

@ -1,3 +1,8 @@
---
title: Детские пособия
layout: default
---
## Детское пособие a.k.a Kindergeld
Каждый ребенок, находящийся в Германии на законных основаниях, имеет право получать детское пособие. В настоящее время оно составляет 192 евро/мес (с 2018 года 194 евро/мес) на каждого ребенка (для многодетных семей немного больше). C 2016 года для его выдачи требуется указать налоговый номер. В общем случае пособие платится до 18 лет, иногда этот срок можно расширить до 25 лет.

View File

@ -1,3 +1,8 @@
---
title: Доверенность
layout: default
---
# Оформление доверенности в украинском консульстве в Берлине
Мне пришлось столкнуться с оформлением доверенности для решения вопросов в Украине. По счастливой случайности я почти не наделал ошибок. Информации о том как это сделать правильно с детальным пошаговым алгоритмом я не нашел. На помощь секретарей консульства тоже можете не рассчитывать.

View File

@ -1,3 +1,8 @@
---
title: Законы
layout: default
---
# Административная и уголовная ответственность
В магазине не складывайте товар в свой пакет, рюкзак и т.п.

View File

@ -1,3 +1,8 @@
---
title: Интернет
layout: default
---
Интернет
========
@ -103,7 +108,7 @@
## Расторжение договора
> **Legal Disclaimer:**
> The paragraph below does not provide legal advice of any kind, and we cannot guarantee that the information is accurate, complete or up-to-date. The opinions and thoughts posted on this page are of a casual nature and may change after further reflection. While we intend to make every attempt to keep the information on this site current, the owners of and contributors to this site make no claims, promises or guarantees about the accuracy, completeness or adequacy of the information contained in or linked to from this site. Full version [in Russian](https://github.com/ewgRa/de_faq#Авторские-права-и-отказ-от-ответственности).
> The paragraph below does not provide legal advice of any kind, and we cannot guarantee that the information is accurate, complete or up-to-date. The opinions and thoughts posted on this page are of a casual nature and may change after further reflection. While we intend to make every attempt to keep the information on this site current, the owners of and contributors to this site make no claims, promises or guarantees about the accuracy, completeness or adequacy of the information contained in or linked to from this site. Full version [in Russian](https://github.com/ru-de/faq#Авторские-права-и-отказ-от-ответственности).
В Германии существует два типа отмены контракта:

View File

@ -1,3 +1,8 @@
---
title: Квартирный вопрос
layout: default
---
# Квартирный вопрос
Квартиры в Германии ищутся только лично, с визитом и осмотрами. Удаленно найти хороший вариант на долгий срок невозможно. Поэтому обычно последовательность выглядит так:

View File

@ -1,4 +1,9 @@
### Консульский учет (![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/ua.gif))
---
title: Консульство
layout: default
---
### Консульский учет (![](https://raw.githubusercontent.com/ru-de/faq/master/files/ua.gif))
Адрес Albrechtstrasse 26, 10117 Berlin [Карта](https://www.google.de/maps/place/Albrechtstra%C3%9Fe+26,+10117+Berlin/@52.5238574,13.3835722,17z/data=!3m1!4b1!4m2!3m1!1s0x47a851ea09f41bfb:0x23c74fb5f7a0c5da?hl=ru)
Есть 2 варианта: постоянны и временный. У товарищей с Голубой Картой вид на жительство ограничен, поэтому временный консульский учет.
@ -16,7 +21,7 @@
- TIP: лучше стать на консульский учет заранее, если вдруг какие проблемы с документантами или подтверждением для родной страны что вы там больше не живете
- TIP: без консульского учета паспорт не меняют, отправляют обратно на Украину
### Загран паспорт (![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/ua.gif))
### Загран паспорт (![](https://raw.githubusercontent.com/ru-de/faq/master/files/ua.gif))
Если старый паспорт заканчивается, его рекомендуют не продлевать - так как оформление новых виз в другие страны становится очень сложным вопросом.
Оформление нового пасспорта предполагает сдачу старого с концами.
- Оплатить можно сразу после подачи документов в окошко, рекомендуют Сomerzbank, ближайшее отделение [тут](https://www.google.de/maps/place/52%C2%B031%2724.4%22N+13%C2%B023%2702.8%22E/@52.5234585,13.3841032,19z/data=!3m1!4b1!4m2!3m1!1s0x0:0x0?hl=en)

View File

@ -1,3 +1,8 @@
---
title: Магазины, скидки, бонусы
layout: default
---
# Магазины
Где выбирать и покупать различные товары:

View File

@ -1,3 +1,8 @@
---
title: Медицина
layout: default
---
## Врачи и медицина
- **Телефон экстренной помощи 112**. Если есть угроза жизни, случилось ДТП с потерпевшими, серьезные вещи требующие медицинской помощи, полиции, пожарных или службы спасения
- Если помощь нужна срочно, либо в тот же день, но к своему врачу по разным причинам не попасть (термин назначили через год, в отпуске, не рабочее время, выходные), и нет угрозы жизни, телефон 116117 http://www.116117info.de/html/

View File

@ -1,3 +1,8 @@
---
title: Мобильная связь
layout: default
---
## Обзор
Операторы, имеющие свои сети - [Vodafone](https://www.vodafone.de/), [O2](https://www.o2online.de/), [T-Mobile](https://www.t-mobile.de/), [E-Plus](https://www.handyflatrate.de/) (последний был куплен O2).

View File

@ -1,3 +1,8 @@
---
title: Мусор
layout: default
---
# Важное уточнение
**В этом документе - общие правила и особенности сортировки мусора, с которыми Вы можете столкнуться. Правила могут отличаться в зависимости от многих факторов: земли, города, домоуправления и т.п. Более детальную информацию о том, как сортировать мусор, Вы можете узнать у своего Hausmeister или у компании, которая занимается вывозом мусора. В Берлине это компания BSR: https://www.bsr.de/**

View File

@ -1,3 +1,8 @@
---
title: Налоги
layout: default
---
# Налоги
У каждого жителя Германии есть налоговый идентификационный номер и налоговый класс.
@ -69,7 +74,7 @@
Для подачи декларации за первый год жизни в Германии рекомендуется прибегнуть к услугам налогового консультанта. В первый год можно получить большое возмещение. Несколько комментариев на эту тему:
* Большой возврат связан с тем, что подоходный налог за год зависит от суммы, полученной за этот год. Ваша компания отчисляет подоходный налог из расчета вашей зарплаты за 12 месяцев. Таким образом, если вы получили денег меньше чем за 12 месяцев, так как приехали, скажем, в октябре, то это означает, что компания перечислила слишком много налогов, и вам положен возврат. Ключевые слова на эту тему для поиска: Steuerfreibetrag, Progressionsvorbehalt.
* Сумма доходов за год является основным фактором для расчета подоходного налога. Поэтому, если вы работаете, например, с 1 января по 31 декабря (весь год полностью), то, скорее всего, большого возврата не получится.
* Если вы приехали один, а на родине временно остались ваши жена, нетрудоспособные дети, родители с малыми доходами, которых вы финансово поддерживали, это тоже может быть вам выгодно в налоговом смысле. [Информация](https://github.com/ewgRa/de_faq/raw/master/files/parentstaxreturn.doc) о возврате налогов за помощь родителям.
* Если вы приехали один, а на родине временно остались ваши жена, нетрудоспособные дети, родители с малыми доходами, которых вы финансово поддерживали, это тоже может быть вам выгодно в налоговом смысле. [Информация](https://github.com/ru-de/faq/raw/master/files/parentstaxreturn.doc) о возврате налогов за помощь родителям.
* Расходы, связанные с переездом (Umzugskosten), могут иметь влияние на сумму налогов. Если речь идет о переезде внутри Германии, то для его учета нужно, чтобы переезд был обусловлен трудовой деятельностью (например, из-за переезда существенно сократилось время в пути на работу).
Общая рекомендация: сохраняйте все чеки и квитанции за все время в Германии, сортируйте по годам. Особенно от всего того, что может как-то быть связано с вашей работой.

View File

@ -1,3 +1,8 @@
---
title: Обязанности на Родине
layout: default
---
# Обязанности на Родине
Несмотря на то, что вы проживаете в Германии, вы остаетесь гражданином своей страны и у вас есть некоторые обязанности, несоблюдение которых может иметь последствия.

View File

@ -1,3 +1,8 @@
---
title: Отпуск и отдых
layout: default
---
## Отдых
- недалеко от Берлина (1-2 часа на поезде), в основном все покрывается [brandenburg ticket](http://www.vbb.de/de/article/touristen/brandenburg-berlin-ticket/10806.html):
- Потсдам (можно доехать на S-Bahn)

View File

@ -1,3 +1,8 @@
---
title: Оформление новорожденных
layout: default
---
## Оформление новорожденных
Данная процедура актуальна на январь 2016, родители граждане Украины, Blaue Karte.
@ -43,12 +48,12 @@
> В украинском посольстве отправляют делать апостиль сюда: https://goo.gl/fdzjlb (2 этаж направо, каб. 225)
### Перевод на украинский язык (![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/ua.gif))
### Перевод на украинский язык (![](https://raw.githubusercontent.com/ru-de/faq/master/files/ua.gif))
Немецкое свидетельство с апостилем переводится у немецкого присяжного переводчика,
стоимость услуги 20 Евро. После чего оно валидно в Украине, так как легализовано в установленном порядке.
### Посольство Украины: справка о присвоении гражданства по факту рождения (![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/ua.gif))
### Посольство Украины: справка о присвоении гражданства по факту рождения (![](https://raw.githubusercontent.com/ru-de/faq/master/files/ua.gif))
Страница на сайте посольства: http://germany.mfa.gov.ua/ua/consular-affairs/services/civil-state/birth
Справка бесплатна, делается неделю.
@ -58,7 +63,7 @@
1. Заявление (форма с сайта http://germany.mfa.gov.ua/ua/consular-affairs/services/citizenship/birth)
### Посольство Украины: загранпаспорт для ребенка (![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/ua.gif))
### Посольство Украины: загранпаспорт для ребенка (![](https://raw.githubusercontent.com/ru-de/faq/master/files/ua.gif))
После того, как справка готова, делаем загранпаспорт.
~~С 2016 года у детей отдельный паспорт, такого понятия как "вписать в паспорт родителей" нет~~ (Путешествовал по Европе и США летом 2016, ребенок 5 лет был указан в загранпаспорте с фоткой, проблем не было). Желательно уточнить процедуру в посольстве, так как на январь 2016 информация на сайте отличалась от фактической процедуры.
@ -89,7 +94,7 @@
Когда паспорт будет готов, по почте на домашний адрес придет приглашение.
### Посольство Республики Беларусь (![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/by.gif))
### Посольство Республики Беларусь (![](https://raw.githubusercontent.com/ru-de/faq/master/files/by.gif))
Все выше перечисленное не совсем подходит для жителей РБ. У нас немного другой план. В связи с тем, что у нас нет разделения на заграничный паспорт и обычный паспорт, есть два варианта развития событий:
1. Операция "Все через посольство"
@ -148,4 +153,4 @@
https://service.berlin.de/dienstleistung/120686/
### Kindergeld, Elterngeld
Смотри файл [Детские пособия](https://github.com/ewgRa/de_faq/blob/master/%D0%94%D0%B5%D1%82%D1%81%D0%BA%D0%B8%D0%B5%20%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%B8%D1%8F.md)
Смотри файл [Детские пособия](https://github.com/ru-de/faq/blob/master/%D0%94%D0%B5%D1%82%D1%81%D0%BA%D0%B8%D0%B5%20%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%B8%D1%8F.md)

View File

@ -1,3 +1,8 @@
---
title: План действий для получивших оффер
layout: default
---
# План действий для получивших job offer в Германии
Уже несколько друзей стали счастливыми обладателями офферов и теперь не устают расспрашивать меня о плане дальнейших действий. Соберу в этом посте краткое резюме из своих ответов, быть может, пригодится и вам :)

View File

@ -1,6 +1,11 @@
---
title: Подтверждение диплома
layout: default
---
# Подтверждение диплома
Информация о процедуре проверки диплома [на официальном сайте](https://www.kmk.org/kmk/information-in-english/statement-of-comparability-for-foreign-higher-education-qualifications.html) ((![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/de.gif)), (![](https://raw.githubusercontent.com/ewgRa/de_faq/master/files/en.gif))).
Информация о процедуре проверки диплома [на официальном сайте](https://www.kmk.org/kmk/information-in-english/statement-of-comparability-for-foreign-higher-education-qualifications.html) ((![](https://raw.githubusercontent.com/ru-de/faq/master/files/de.gif)), (![](https://raw.githubusercontent.com/ru-de/faq/master/files/en.gif))).
Есть отдельные указания для Blue Card, есть отдельные указания для стран (Украина и т. д.)
Сперва надо оформить [заявку онлайн](https://www.kmk.org/kmk/information-in-english/statement-of-comparability-for-foreign-higher-education-qualifications/application-and-fees/application-form.html).

View File

@ -1,3 +1,8 @@
---
title: Приглашение (Verpflichtungserklärung)
layout: default
---
## Страница услуги
https://service.berlin.de/dienstleistung/120691/
@ -50,7 +55,7 @@ https://service.berlin.de/dienstleistung/120691/
В одной приглашении можно указать супруга или супругу приглашенного человека и его несовершеннолетних детей.
При подаче приглашения совсем не лишним будет приложить еще рукописное приглашение, ему в посольствах всегда рады.
Если жена не работает то, чтобы пригласить ее родителей, приглашение делается от мужа. В посольство жена должна написать письмо от руки, похожее на приглашение. Образец письма на короткий срок пребывания можно найти [тут](https://github.com/ewgRa/de_faq/blob/master/files/Einladung%20(short%20term).docx?raw=true), на длинный [тут](https://github.com/ewgRa/de_faq/blob/master/files/Einladung%20(long%20term).docx?raw=true).
Если жена не работает то, чтобы пригласить ее родителей, приглашение делается от мужа. В посольство жена должна написать письмо от руки, похожее на приглашение. Образец письма на короткий срок пребывания можно найти [тут](https://github.com/ru-de/faq/blob/master/files/Einladung%20(short%20term).docx?raw=true), на длинный [тут](https://github.com/ru-de/faq/blob/master/files/Einladung%20(long%20term).docx?raw=true).
Также на подачу документов в посольство родственники должны взять документы, подтверждающие родство.
## Документы на шенгенскую визу по приглашению

View File

@ -1,3 +1,8 @@
---
title: Работа
layout: default
---
## Работа
Поиск вакансий:

View File

@ -1,3 +1,8 @@
---
title: Регистрация места жительства
layout: default
---
# Регистрация места жительства
В течение **14 дней** после переезда на новое место жительства в Германии вы обязаны зарегистрироваться. Это необходимо делать только для долгосрочного проживания (более двух месяцев), краткосрочное проживание, например, в отеле, регистрировать не обязательно.

View File

@ -1,3 +1,8 @@
---
title: Страховки
layout: default
---
## Страховки
### Какие виды страховок Вам необходимы?

View File

@ -1,3 +1,8 @@
---
title: Телевидение
layout: default
---
# Телевидение
## ZDF и Rundfunktbeitrag

View File

@ -1,3 +1,8 @@
---
title: Транспорт
layout: default
---
## Транспорт
Те, кто прописан в Берлине, могут купить VBB Monatskarte с неплохой скидкой (за 63,42 EUR). Для этого нужно подойти в VBB центр по работе с клиентами с Anmeldung, удостоверением личности и карточкой банка. Вы заполните анкету и получите карточку по почте. На то время, пока вы ее не получили, вам выдадут временный Monatskarte(Startkarte), за который нужно заплатить (у меня вышло 53 EUR с 4-го числа до конца месяца). Я подходил в центр на Alexanderplatz, там немного говорят по-английски, достаточно, чтобы помочь заполнить.

View File

@ -1,3 +1,8 @@
---
title: Финансы и Банки
layout: default
---
## Банки
### Предупреждение
@ -26,7 +31,7 @@
Как правило онлайн банки предоставляют на выбор два варианта идентификации: Видео-идентификация или идентификация в почтовом отделении.
В [N26](https://n26.com/) биометрический загранпаспорт РФ подходит для видео-идентификации. Пятилетний российский паспорт (без биометрии) идентифицировать онлайн не получится
Есть удачный опыт прохождения видео-идентификации в N26 с паспортами Украины (see [#147](https://github.com/ewgRa/de_faq/issues/147)).
Есть удачный опыт прохождения видео-идентификации в N26 с паспортами Украины (see [#147](https://github.com/ru-de/faq/issues/147)).
Остается вариант идентификации в почтовом отделении. Процедура бесплатная. Для прохождения следует взять свой заграничный паспорт, PDF файл с кодом почтовой идентификации который был получен на последнем этапе регистрации в банке, документ о регистрации места жительства.

View File

@ -1,3 +1,8 @@
---
title: Фриланс
layout: default
---
## Freiberufler
Мы собрали часто задаваемые вопросы и ответы из нашего чата о том как стать Freiberufler. Кому-то будет полезно, в сборе вопросов участвовали @ilya.n @wowa @Ghedeon.

View File

@ -1,3 +1,8 @@
---
title: Электричество
layout: default
---
# Электричество
## Как подключить электричество в новую квартиру?

View File

@ -1,3 +1,8 @@
---
title: Языковые курсы
layout: default
---
## Интеграционные курсы, языковые курсы:
### Языковые школы

25
search.html Normal file
View File

@ -0,0 +1,25 @@
---
layout: default
---
<ul id="search-results"></ul>
<script>
window.store = {
{% for page in site.pages %}
{% if page.url contains 'pages/' %}
"{{ page.url | slugify }}": {
"title": "{{ page.title | xml_escape }}",
"author": "{{ page.author | xml_escape }}",
"category": "{{ page.category | xml_escape }}",
"content": {{ page.content | strip_html | strip_newlines | jsonify }},
"url": "{{ page.url | relative_url }}"
}
{% unless forloop.last %},{% endunless %}
{% endif %}
{% endfor %}
};
var assetsUrl = "{{ '/assets' | relative_url }}";
</script>
<script src="{{ "assets/require.js" | relative_url }}"></script>
<script src="{{ "assets/search.js" | relative_url }}"></script>

25
update.sh Normal file
View File

@ -0,0 +1,25 @@
DE_FAQ_DIR=/tmp/de_faq
rm -rf $DE_FAQ_DIR
git clone https://github.com/ru-de/faq.git $DE_FAQ_DIR --depth=1
rm $DE_FAQ_DIR/CONTRIBUTING.md
rm $DE_FAQ_DIR/README.md
mkdir $DE_FAQ_DIR/tmp_pages
for file in $DE_FAQ_DIR/*.md; do
bname=$(basename "$file")
title=$(basename "$file" .md)
(echo "---\ntitle: $title\nlayout: default\n---\n"; cat "$file") > "$DE_FAQ_DIR/tmp_pages/$bname"
done
sed -i -- 's/ewgRa\/de_faq/ru-de\/faq/g' $DE_FAQ_DIR/tmp_pages/*.md
rm -rf pages
mkdir pages
cp -R $DE_FAQ_DIR/files pages
sed -i -- 's/ewgRa\/de_faq/ru-de\/faq/g' pages/files/known_url.csv
cp $DE_FAQ_DIR/tmp_pages/*.md pages